【Mysql】事务
四大特性
- 原子性 (由回滚机制保证)
- 隔离性 (由事务的隔离级别保证)
- 持久性 (由日志保证)
- 一致性 (由前三者共同保证)
隔离级别
隔离脏读、不可重复读以及幻读三种可能出现的问题
读未提交
什么都避免不了
读提交
可以避免脏读
可重复读
可以避免脏读、不可重复读以及很大程度上避免幻读
串行化
全可以避免
MVCC(多版本并发控制)
在读提交和可重复读隔离级别下,都采用了多版本并发控制的方式来实现事务之间的隔离,MVCC是通过Read View来实现的
Read View中存储了当前活跃(创建了的但还未提交)事务的id列表、活跃事务中最小的id、活跃事务中最大的id+1(下一个新建的事务id)、当前事务id
每一条数据记录中还有两列隐藏列,分别是最近一次修改该条记录的事务id以及undo指针
读提交:
在每一次查询前都创建一个Read View,如果所查询的这条记录中最近一次修改的事务id值小于Read View中活跃事务id列表中最小的id值,说明查询到的这条数据是已经在之前提交过的了,因此可以读取。反之,则要通过undo指针寻找到之前的记录,直到该条记录的最近一次修改的事务id值小于活跃事务id列表中最小的id值
可重复读
只在事务开始阶段创建一个Read View,期间不管发生多少次查询,都使用的是一开始创建的这个Read View。其余规则同读提交一样。