【Mysql】事务


四大特性

  1. 原子性 (由回滚机制保证)
  2. 隔离性 (由事务的隔离级别保证)
  3. 持久性 (由日志保证)
  4. 一致性 (由前三者共同保证)

隔离级别

隔离脏读、不可重复读以及幻读三种可能出现的问题

读未提交

什么都避免不了

读提交

可以避免脏读

可重复读

可以避免脏读、不可重复读以及很大程度上避免幻读

串行化

全可以避免

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。其余规则同读提交一样。