查看当前会话隔离级别
select @@tx_isolation;
查看系统当前隔离级别
select @@global.tx_isolation;
设置当前会话隔离级别
set session transaction isolation level READ COMMITTED;
开启事务
set autocommit=off
或start transaction
或begin
隔离级别
-
read uncommitted
(读取未提交数据)
A 事务能读取到,B事务修改的但未提交的数据 (脏读)
-
read committed
(可以读取其他事务提交的数据)
A 事务不能读取到,B事务修改的但未提交的数据
A 事务能读取到,A事务修改的但未提交的数据
A 事务能读取到,B事务修改的并提交的数据
//新开2个会话按如下顺序执行,测试:
//A 事务 (会话1)
set session transaction isolation level READ COMMITTED;
begin ;
SELECT value FROM xx_table WHERE id=1; //此时 value字段值为1
//B事务 (会话2)
set session transaction isolation level READ COMMITTED;
begin
SELECT value FROM xx_table WHERE id=1 //此时 value字段值为1
//A事务
UPDATE xx_table SET `value` = 2 WHERE id = 1;
COMMIT;
//B事务
SELECT value FROM xx_table WHERE id=1 //此时 value字段值为2 (不可重复读)
- repeatable read (可重读)
A 事务不能读取到,B事务修改的但未提交的数据
A 事务能读取到,A事务修改的但未提交的数据
同一条数据中
,A 事务不能读取到,B事务修改的并提交的数据 (可重读)
//新开2个会话按如下顺序执行,测试:
//A 事务 (会话1)
set session transaction isolation level REPEATABLE READ;
begin ;
SELECT value FROM xx_table WHERE id=1; //此时 value字段值为1
//B事务 (会话2)
set session transaction isolation level READ COMMITTED;
begin
SELECT value FROM xx_table WHERE id=1 //此时 value字段值为1
//A事务
UPDATE xx_table SET `value` = 2 WHERE id = 1;
COMMIT;
//B事务
SELECT value FROM xx_table WHERE id=1 //此时 value字段值 还是为 1 (可重复读),和读提交级别的区别
- serializable 串行化
写读操作事务,需等待其他事务执行完
参考资料