MVCC的实现原理主要取决于每个记录的每个记录中的三个隐藏字段。
隐藏字段
图中的db_row_id是数据库不相信该行记录的唯一隐藏主键。db_trx_id是记录当前操作的事务ID。DB_roll_ptr是一个滚动指针,可与撤消日志合作,以指向旧版本的旧版本。
撤消日志
Undog被称为回滚日志,表明在执行插入,删除和更新过程中滚动滚动滚动卷的便利性。
当执行插入操作(没有记录)时,仅在交易滚动时生成的Undog生成的需求,并且在提交交易后可以立即将其丢弃
当更新和删除操作(最初记录,修改了数据)时,不仅在交易滚动时需要生成的UNDOLOL,而且还需要随意删除。滚动不涉及此日志,相应的日志将通过清除线程(当数据更新并删除数据时,您只需设置旧记录DELETED_BIT.DISK SPACE,INNODB就有一个专用的清除线程来删除DELETED_BIT的记录为true。与清除线的读取视图相比,DB_TRX_ID可见,然后可以在一定时间清除此记录)。
让我们看一下由Undog产生的记录链
1.假设有交易的交易数字1 1将记录插入表格,那么此时数据的状态为:
2.假设有第二个交易编号可以修改记录的名称,然后将其更改为LISI
当数据库的记录数据被修改时,数据库将锁定他
然后将行的数据复制为UNDOLOG作为旧记录,也就是说,当前行的副本
复制后,将银行的名称修改为LISI,并将隐藏字段的痴迷修改为当前交易2的ID。
交易提交后,锁定锁定
3.假设有第三个交易编号在记录的年龄上被3修改,并且已更改为32
当交易3修改银行的数据时,数据库将把他锁定到银行
然后将行数据复制为旧记录,并发现银行记录已经具有Undogs。
将银行的年龄修改为32岁,并将隐藏字段的交易ID修改为当前交易3的ID。
提交交易,发布锁
呢[](((((((((((((((((((((((),
从上面的一系列图表中,每个人都可以发现,对不同交易或相同交易的相同记录的修改将导致记录的繁殖,以生成线性表的记录版本,即链接列表,链接列表,Undolog连锁店的负责人是最新的旧唱片。链的尾巴是最早的旧唱片。
阅读视图
阅读视图是交易运行时产生的阅读视图。在交易执行快照的那一刻,它将生成数据系统的当前快照,以记录和维护系统当前活动交易的ID。交易的ID值正在增加。
实际上,阅读视图的最大作用用于做出可见性判断,这意味着当交易执行快照阅读时,创建记录的读取视图,该视图被用作判断当前交易的条件,可以看到。数据的哪个版本可以读取最新数据,或者可以读取当前记录的UNDOLOG中的数据版本
读取视图的可见算法主要是在修改后的数据的最新记录中取出DB_TRX_ID(当前事务ID),将其与系统中当前其他活动交易的ID进行比较。通过db_roll_ptr来取出undog中的db_trx_id进行比较,即链接列表中的db_trx_id,直到找到db_trx_id的旧记录可满足条件。
可见的阅读视图规则如下所示:
首先,您必须知道阅读视图中的三个全局属性:
trx_list:用于维护读取视图生成的时间系统的数字列表是活动事务ID(1,2,3)
UP_LIMIT_ID:在trx_list列表中记录最小事务ID的ID(1)
LOW_LIMIT_ID:阅读视图生成未分配系统的下一个交易ID,(4)
具体比较规则如下:
1.首先比较db_trx_id < up_limit_id,如果小于,则当前事务能看到DB_TRX_ID所在的记录,如果大于等于进入下一个判断
2、接下来判断DB_TRX_ID >= low_limit_id,如果它大于db_trx_id的记录,则出现在读取视图之后,那么当前事务绝对看不到。
3.确定db_trx_id是否在主动交易中。如果在此中,则意味着在阅读视图时,此交易仍然处于活动状态。没有提交,修改的数据,并且当前的交易是不可见的。该提交在生成读取视图之前已经开始,因此可以看到修改的结果。
接下来,我们根据可见算法对MVCC的处理过程进行分类
假设同时有四个交易,如下图所示:
交易开始交易的开始,开始交易开始交易...
....................................
从表格中,我们可以看到,当交易2对执行快照读取操作时,数据库为银行创建读取视图1。low_limit_id是5.AS.AS如下所示:
呢[](((((((((((((((((((((((),
银行当前数据的繁殖如下所示:
呢[](((((((((((((((((((((((),
当交易2读取行记录时,将行记录的DB_TRX_ID与UP_LIMIT_ID,LOWER_LIMIT_ID和活动交易列表进行比较。判断交易2可以查看银行中记录的版本。
特定过程如下:首先将银行(4)记录的交易ID与读取视图中的UP_LIMIT_ID相比,确定它是否小于此,并且比较的发现不小于条件。并不大于此,因此不符合条件。确定交易4是否在TRX_LIST列表中处理,并发现交易4是一个活动列表,不符合可见条件。
交易开始时交易开始交易开始交易的开始...
....................................
从上面的形式中,我们可以看到,当交易2对数据的数据执行快照读数时,数据库会为银行数据生成读取视图。您可以看到交易1和交易3仍然处于活动状态。2更新是在快照读取之前提交的,因此当前有效事务的系统在读取视图中记录了1,2,3,并将维护维护在列表中。同时,您可以看到UP_LIMIT_ID的值为1,而Low_limit_id为5,如下图所示:
呢[](((((((((((((((((((((((),
在上面的示例中,银行仅修改了交易4,并在读取交易2之前提交了交易。因此,银行当前数据的当前数据如下所示:
呢[](((((((((((((((((((((((),
当交易2在例程中读取时,将银行记录的DB_TRX_ID与UP_LIMIT_ID,LOGER_LIMIT_ID和AINKIT TRASICTACTION列表进行比较。判决交易2可以查看银行中的哪一个。
具体过程如下:首先,将银行(4)记录的交易ID与read视图中的UP_LIMIT_ID相比,确定它是否小于此,并且比较的发现不小于条件。并不大于此,因此不符合条件。确定交易4是否在TRX_LIST列表中处理并发现可见条件再次在列表中不可用。全球视角的最新版本。
在交易开始时,交易开始交易的开始和提交..............................................................
快照阅读
..............
从表格中,我们可以看到,当交易2对执行快照读取操作时,数据库为bank创建读取视图。LOW_LIMIT_ID为5.AS 5.AS。
呢[](((((((((((((((((((((((),
目前,db_trx_id为1,小于up_limit_id(2),因此当前的交易可以看到事务的记录1修改
交易开始交易的开始
修改并提交............
快照阅读
..........................
修改不是从表中提交的,我们可以看到,当交易2对数据执行一排数据读取操作时,数据库为银行创建了读取视图。和low_limit_id是4.AS 4.AS。
呢[](((((((((((((((((((((((),
从上面的分析中可以知道,事务1对的修改对事务2的快照可见,但是交易4被数据修改。目前,db_trx_id = low_limit_id,即交易4是在创建快照之后的数据之后,因此可以通过数据进行数据,因此交易2的快照无法读取交易4的修改,对银行的数据进行了修改。
在RC隔离级别中,每个快照都读取并获取最新的ReadView。
交易开始交易的开始
修改并提交............
快照阅读
..........................
..............................
对于交易2的第一个快照读数,主动事务为2、3,up_limit_id的值为2,而low_limit_id为4. revise。
交易2的第二个快照可以读取事务1的修改,活动交易为2、3、4,up_limit_id的值为2,low_limit_id为5,但是db_trx_id = 4 <5的修改是否确定它是否是活动的要成为ActiveAffairs是主动交易,因此您看不到4对数据的修改。
交易开始交易的开始
修改并提交............
快照阅读
..........................
....................................
快照阅读...
在对事务2的第一个快照中,主动事务为2和3。up_limit_id的值为2,而Low_limit_id为4。事务2的第一个快照读数可以读取交易的修改1。
在交易2的第二张快照读取中,活动交易仍然是2和3,并且可以读取事务的修改1.修改db_trx_id = 4 <low_limit_id,因此请确定它是否是活动交易,而不是活动的事务,所以I可以看到4对数据的修改。
RR隔离级别是在第一次执行快照时创建读取视图。每个快照都读取此readview。
1.数据版,对于事务视图,除了您自己的更新外,总有三种情况。
2.与读取视图的不同时间不同,RC和RR级别的结果不同。
1. RR级别下的交易记录记录记录记录记录的第一个快照将创建快照,即读取视图,该视图记录了当前系统中其他活动的其他交易。它是相同的读取视图,因此由于当前的交易在提交其他交易之前的读数过快,因此快照会读取相同的读取视图,因此以后的修改不可见。
2.在RR级别,当快照读取读取视图时,读取视图将在此时记录所有其他活动和交易快照。修改都是可见的
3.在RC级别,在交易中,每个快照都读取新快照并读取视图。这就是为什么我们可以在RC级别下看到交易中其他交易的更新。
摘要:在RC隔离级别中,每个快照都读取并获得了最新的读取视图,并且在RR隔离级别上,它是同一交易中的第一个快照读数,以创建读取视图。之后,将创建快照。
3. MVCC仅存在于RC和RR隔离级别中。其他两个隔离级别不需要由MVCC使用,因为读数未直接提交以修改原始数据。当查看数据时可以看到其他交易时,根本就不需要版本字段。序列化本身是阻止其他交易的阅读操作,而在阅读时未优化MVCC,因此不能在串行隔离级别中使用它。
“凤凰建筑”
“对分布式交易的深度理解”
原始:https://juejin.cn/post/7102676257149550622