mysql MVCC中高水位先的trx_id
读《mysql45讲》之后的总结
InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。“活跃”指的就是,启动了但还没提交
数组里面事务 ID 的最小值记为低水位,当前系统里面已经创建过的事务 ID 的最大值加 1 记为高水位。
这个视图数组和高水位,就组成了当前事务的一致性视图(read-view)。
先给个总结
MVCC数组中的trx_id为读写事务的id
我一开是看的时候,总认为MVCC中高水位,就是当前事务ID+1
不过实际上不是
T1 | 查看事务Id | T2 | |
步骤1 |
begin;
|
||
步骤2 |
use information_schema; select trx_id ,trx_mysql_thread_id from innodb_trx; |
||
步骤3 |
select * from t where id=1; |
||
步骤4 |
select trx_id ,trx_mysql_thread_id from innodb_trx; |
||
步骤5 |
begin; update t set name='test2' where id=1; |
||
步骤6 | select trx_id ,trx_mysql_thread_id from innodb_trx; | ||
步骤7 | commit; | ||
步骤8 | update t set name='test1' where id=1; | ||
步骤9 | select trx_id ,trx_mysql_thread_id from innodb_trx; |
[步骤1,步骤2] begin不是事务的启动开始时机,具体的我这边不细说,只是顺便给出证明结果
[步骤3,步骤4] 事务T1启动,是执行了 select * from t where id=1; 分配了一个只读事务的id
[步骤5,步骤6] 事务T2启动,执行了 update t set name='test2' from t where id=1 ,分配了一个读写事务的id (注意不是只读事务)
[步骤8,步骤9] 事务T1执行 update t set name='test1' from t where id=1; 分配 读写事务的id (注意看线程ID),事务的id从只读ID变成了读写ID ,且改ID小于后面启动的T2的事务ID
先启动的事务,分配了一个更大的读写事务的ID
InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。“活跃”指的就是,启动了但还没提交。
MVCC数组中的trx_id为读写事务的id
事务T1在启动瞬间,构造自己的数组,本身是个select操作,分配的是只读事务trx_id,MVCC中就不会包括自己的事务id,高水位更加不是自己的trx_id +1
事务T2在启动瞬间,虽然存在活跃的事务T1,但是T1最开始的trx_id为是只读事务ID,T2构造的数据中,就不会存在T1的事务id
posted on 2022-08-19 19:34 xingshouzhan 阅读(421) 评论(0) 编辑 收藏 举报