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编辑  收藏  举报

导航