四种隔离级别
- 读未提交(read uncommitted):
- 事务还未提交时能被其他事务看到
- 读提交(read committed):
- 事务提交后才能被其他事务看到
- 可重复读(repeatable read)(默认选项):
- 事务执行过程中看到的数据和该事务启动时一致
- 串行化(serializable):
- 读写冲突的时候,后一个事务必须等前一个事务执行完成才能继续执行
示例
初始化
|
|
对于如下示例,在不同的隔离级别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操作时会读当前并更新视图