四种隔离级别

  • 读未提交(read uncommitted):
    • 事务还未提交时能被其他事务看到
  • 读提交(read committed):
    • 事务提交后才能被其他事务看到
  • 可重复读(repeatable read)(默认选项):
    • 事务执行过程中看到的数据和该事务启动时一致
  • 串行化(serializable):
    • 读写冲突的时候,后一个事务必须等前一个事务执行完成才能继续执行

示例

初始化
1
2
3
CREATE DATABASE TEST;
CREATE TABLE T(c int) engine InnoDB;
INSERT INTO T(c) values(1);
对于如下示例,在不同的隔离级别c1/c2/c3的结果分别是什么?
事务A 事务B
start transaction;
select * from t;
start transaction;
update t set c = c + 1 where c = 1;
select * from t;(c1)
commit;
select * from t;(c2)
commit;
select * from t;(c3)
  • read uncommitted : 均为2
  • read committed : c1为1,c2/c3为2
  • repeatable read : c1/c2为1, c3为2
  • serializable : c1/c2为1, c3为2 (事务B update时阻塞)

底层实现逻辑

  • “读未提交”隔离级别下直接返回记录上的最新值
  • “串行化”隔离级别下直接用加锁的方式来避免d并行访问
  • “读已提交”事务在每次Read操作时,都会建立Read View
  • “可重复读”在事务第一次Read时建立一个视图,整个事务存在期间都用这个视图,但是update操作时会读当前并更新视图

视图回滚日志

参考