Mysql事务隔离级别(无废话版)

测试数据

DROP TABLE IF EXISTS IsolationTests;
CREATE TABLE IsolationTests
(
    Col1 INT,
    Col2 INT,
    Col3 INT
);

INSERT INTO IsolationTests(Col1,Col2,Col3)
SELECT 1,2,3
UNION ALL SELECT 1,2,3
UNION ALL SELECT 1,2,3
UNION ALL SELECT 1,2,3
UNION ALL SELECT 1,2,3
UNION ALL SELECT 1,2,3
UNION ALL SELECT 1,2,3;

读未提交(READ UNCOMMITTED)

-- T1                                              - T2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;                                             BEGIN;
UPDATE IsolationTests SET Col1 = 2;                
                                                   -- Col1=2, dirty read 
                                                   SELECT * FROM IsolationTests;    
ROLLBACK;                                          
                                                   -- Col1=1
                                                   SELECT * FROM IsolationTests;  
                                                   COMMIT; 

读已提交(READ COMMITTED)

-- T1                                             -- T2                                            
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;   SET TRANSACTION ISOLATION LEVEL READ COMMITTED;  
BEGIN;                                            BEGIN;                                           
                                                  -- Col1 = 1                   
                                                  SELECT * FROM IsolationTests;    
UPDATE IsolationTests SET Col1 = 2;               
                                                  -- Col1 = 1, T1 uncommitted 
                                                  SELECT * FROM IsolationTests;    
COMMIT;
                                                  -- Col1 = 2, T1 committed 
                                                  SELECT * FROM IsolationTests;    
												  COMMIT;                                          

可重复读(REPEATABLE READ)

-- T1                                             -- T2                                            
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;  SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;  
BEGIN;                                            BEGIN;                                           
                                                  -- Col1 = 1                   
                                                  SELECT * FROM IsolationTests;    
UPDATE IsolationTests SET Col1 = 2;               
                                                  -- Col1 = 1, T1 uncommitted
                                                  SELECT * FROM IsolationTests;    
COMMIT;
                                                  -- Col1 = 1, T1 committed
                                                  SELECT * FROM IsolationTests;    
                                                  COMMIT;

幻读(REPEATABLE READ)

-- T1                                              -- T2                                            
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ ;  SET TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
BEGIN;                                             BEGIN;                                           
                                                   -- empty 
                                                   SELECT * FROM IsolationTests where Col1=2;  
INSERT INTO IsolationTests values (2,2,3);                                 
COMMIT;                                            
                                                   -- empty      
                                                   SELECT * FROM IsolationTests where Col1=2;   
                                                   -- Update with forced latest snapshot 
                                                   UPDATE IsolationTests SET Col2=3, Col3=4 where Col1=2;
                                                   -- Phantom Read : Col (2, 3, 4)
                                                   SELECT * FROM IsolationTests where Col1=2;
                                                   COMMIT;