读《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
标签:步骤,事物,mysql,ID,trx,MVCC,id,select From: https://www.cnblogs.com/sxrtb/p/16603155.html