时间:2021-07-01 10:21:17 帮助过:32人阅读
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/68
每一行额外包含三个隐藏字段:
select操作对两者都不修改,只读相应的数据。
dulint low_limit_id; /* 事务号 >= low_limit_id的记录,对于当前Read View都是不可见的 */
dulint up_limit_id; /* 事务号 < up_limit_id ,对于当前Read View都是可见的 */
ulint n_trx_ids; /* Number of cells in the trx_ids array */
dulint* trx_ids; /* Additional trx ids which the read should
not see: typically, these are the active
transactions at the time when the read is
serialized, except the reading transaction
itself; the trx ids in this array are in a
descending order */
dulint creator_trx_id; /* trx id of creating transaction, or
(0, 0) used in purge */
关于low_limit_id,up_limit_id的理解:
up_limit_id:当前已经提交的事务号 + 1,事务号 < up_limit_id ,对于当前Read View都是可见的。理解起来就是创建Read View视图的时候,之前已经提交的事务对于该事务肯定是可见的。
low_limit_id:当前最大的事务号 + 1,事务号 >= low_limit_id,对于当前Read View都是不可见的。理解起来就是在创建Read View视图之后创建的事务对于该事务肯定是不可见的。
另外,trx_ids为活跃事务id列表,即Read View初始化时当前未提交的事务列表。所以当进行RR读的时候,trx_ids中的事务对于本事务是不可见的(除了自身事务,自身事务对于表的修改对于自己当然是可见的)。理解起来就是创建RV时,将当前活跃事务ID记录下来,后续即使他们提交对于本事务也是不可见的。
步骤 | 1 | 2 | 3 |
---|---|---|---|
一 | begin | ||
二 | begin | ||
三 | insert into test(score) values(1607); 假设此时事务号21 | ||
四 | insert into test(score) values(1607); 此时事务号22 | ||
五 | 此时创建读视图,up_limit_id = 21, low_limit_id = 23 活跃事务列表为(21,22) | ||
六 | insert into test(score) values(1620); 事务号为23 | ||
七 | insert into test(score) values(1621); 事务号为24 | ||
八 | insert into test(score) values(1622); 事务号为25 | ||
九 | select * from test; 此时的up_limit_id 为21,low_limit_id 为26,活跃事务列表为(21,22),故21,22在活跃事务列表不可见 | ||
十 | select * from test; 此时low_limit_id为26,up_limit_id 为21,活跃事务列表是(21,22) 22本事务自身可见。21的在活跃事务列表不可见。23,24不在活跃事务列表,可见 | ||
十一 | select * from test; 事务内readview不变,low_limit_id = 23,up_limit_id = 21,活跃事务列表 (21,22)。故21自身可见,22在活跃事务列表不可见。>=23的都不可见 |
注意的几点:
begin
时创建的。如果Read View视图是在事务刚begin
时创建的,那么在步骤四中事务22的Read View就定下来了(up_limit_id = 21,low_limit_id = 23),那么在步骤十中就看不到3中提交的数据了,因为事务号23,24,25大于等于事务22.low_limit_id参考资料:http://hedengcheng.com/?p=148
MySQL MVCC机制
标签:creating 技术 cell val from 字段 https ble 技术分享