隔离级别
共4个,由低到高依次为Readuncommitted、Readcommitted、Repeatableread、Serializable。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Readuncommitted | √ | √ | √ |
Readcommitted | × | √ | √ |
Repeatableread | × | × | √ |
Serializable | × | × | × |
1.Readuncommitted读未提交
A事务 | B事务 |
---|---|
读余额为2000元 | |
转出1000元 | |
再次读余额为1000元 | |
发现不对,回滚转出的1000元 | |
再次读余额为2000元,很纳闷 |
总结:B事务还没提交,A事务就能实时读到数据,出现脏读
2.Readcommitted读提交
A事务 | B事务 |
---|---|
读余额为2000元 | |
转出1000元,提交事务 | |
再次读余额为1000元 |
总结:解决了脏读,但A事务两次读取的不一致,出现不可重复读
3.Repeatableread可重复读
A事务 | B事务 |
---|---|
读余额为2000元,并且读流水明细记录为0条 | |
转出1000元,同时插入流水明细记录id为record001,提交事务 | |
再次读余额为2000元,并且再次读流水明细记录还是0条。但是对流水明细表进行insert操作,不能再新增id为record001的记录,对record001进行delete和update操作,影响条数都为1 |
总结:解决了不可重复读,但是对于B事务进行新增和删除记录,A事务存在幻读(读不到但是可以操作)。
4.Serializable序列化
A事务 | B事务 |
---|---|
代码A1 | |
代码A2 | |
代码B1 | |
代码B2 |
总结:A事务先开始,就一条一条执行,直到事务结束,才开始B事务,一条一条执行,直到事务结束。解决了所有问题,但是代价最高,性能很低,一般很少使用。