标签:管理系统 segment 控制 顺序 并发 一个 rdb byte 系统
下面我们来看一个小demo,我这里新建来一张表mvcc_test,表字段有id和num。这里插入一笔数据 id=1 num=12
现在我们假设有3个事务,按以下顺序执行(如下图):
那么请问步骤7和8执行的结果的num分别是多少?
答案是:14和12
我们伟大的小平同志曾经说过:“实践是检验真理的唯一标准”,这里我们实际来操作一下试试!!!下面我们按照操作步骤执行
步骤1 ——开启事务A
步骤2——开启事务B
步骤3——执行查询A
步骤4——执行查询B
步骤5——执行事务C
步骤6——执行事务B更新
步骤7——执行事务B查询
步骤8——执行事务A查询并commit
很神奇对吧,下面我们就谈谈它的原理。
首先了解MVCC里面2个重要概念
快照读和当前读
快照读:像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;
当前读:就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。
InnerDB的事务管理
事务ID和顺序递增
在mysql的每一行数据中有3个隐藏字段
假设我们现在表中数据id=1的事务id=100
在执行步骤1和2之后,由于事务的顺序递增特性,事务A的事务id=101,事务B的id=102
在执行步骤3的时候因为是查询,所以会生成一个num=12的快照,进行快照读,步骤4同理
在执行步骤5时候,因为是更新操作,进行当前读,事务C会创建一个新事务,事务id=103,并修改当前最新版本DB_TRX_ID=103,num变成13
此时执行步骤6,进行当前读,事务B读取读DB_TRX_ID不是100,而是103,读取到num为13进行更新操作,num变成14
执行步骤7查询,进行快照读还是事务A开启时候读快照所以num结果还是12。
执行步骤8查询,因为在事务B中我们进行最后的更新操作,所以可以返回最新的num值14。
标签:管理系统 segment 控制 顺序 并发 一个 rdb byte 系统
原文地址:https://www.cnblogs.com/shawn-sun/p/14444258.html