概念
Repeatable Read(可重复读):即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。
实现原理(MVCC [ 多版本并发控制 ])
InnoDB在每行记录后面保存两个隐藏的列来,分别保存了这个行的创建时间和行的删除时间。这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1
在读取事务开始时,系统会给当前读事务一个版本号,事务会读取版本号<=当前版本号的数据
此时如果其他写事务修改了这条数据,那么这条数据的版本号就会加1,从而比当前读事务的版本号高,读事务自然而然的就读不到更新后的数据了
现在通过实验,对问题进行下分析:
1.在终端A开启事务A,查询一下。
START TRANSACTION;select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;
结果如下:
2.在终端B开启事务B,进行同样的查询,可见结果和事务A中的结果是一样的。
START TRANSACTION;select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;<