首页 > 数据库 >mysql MVCC中高水位先的trx_id

mysql MVCC中高水位先的trx_id

时间:2022-08-19 19:44:22浏览次数:81  
标签:步骤 事物 mysql ID trx MVCC id select

读《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

相关文章

  • mysql
    1.表结构InnoDB和MyISAM的区别这两个在数据目录下对应的数据库子目录会创建一个专门用于描绘表结构的文件,以 表名.frm 为结尾的文件。InnoDB还会创建 表名.ibd文件 存......
  • MySQL日志详解
    一、mysql日志日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、二进制日志、查询日志、慢查询日志、事务日志(redolog......
  • 【三大锁】悲观锁——mysql悲观锁
    一三大常用锁悲观锁你准备去银行取10w了,跟银行提前打个招呼,有个10w现金谁都别动。(一般只限制写-别人不能取那10w但是能查到银行总体余额,某些场景会限制读)乐观......
  • Mysql——常用语法
    这里只记录一些mysql语句,用于代替python进行大量的简单性工作。循环创建语句:delimiter$$#声明存储过程的结束符号为$$createprocedureauto_insert1()#相当于声明......
  • mysql运行sql文件报错[ERR] 2006 - MySQL server has gone away [ERR] -- MySQL dump
    原因:在运行数据库脚本文件时报该错,由于mysql对max_allowed_packect 允许最大的数据包的大小有限制解决方法:1.先查看现在允许的最大包大小,单位(字节) select@@max_allow......
  • MySQL事务与锁
    数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是......
  • MySQL视图、触发器、事务
    一、视图1.什么是视图SQL语句的执行结果是一张虚拟表我们可以基于该表做其他操作如果这张虚拟表需要频繁使用那么为了方便可以将虚拟表保存起来保存起来之后就称之为......
  • mysql数据库修改登录密码策略
    showvariableslike'validate_password%';  查看登录密码策略默认策略  1、查看mysql初始的密码策略,    输入语句“SHOWVARIABLESLIKE'validate_p......
  • mysql数据库安装(windows)
    一、下载解压缩文件(免安装版)个人认为配置起来很方便,免去了安装的时各种选择,不用管对应的安装依赖问题。官网下载地址:https://dev.mysql.com/downloads/mysql/二......
  • 在docker内 mysql 中执行sql文件
    通过dockerps查询当前运行的容器,找到mysql容器的iddockerps将项目内的SQL文件拷贝到mysql容器内部的home下的temp文件内sudodockercp/root/sqlfile/mydata.sql8c......