IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mysql中事务id,有啥用? -> 正文阅读

[大数据]mysql中事务id,有啥用?

trx_id是Innodb中标识一个事务的id,是一个6字节长度的整数。这个id的值来源于Innodb维护的max_trx_id,当需要申请一个新的trx_id值时,就获取max_trx_id的最新值,然后将max_trx_id值加1。

注:max_trx_id和row_id类似,存储时使用数据类型是8字节,但是只使用其后6字节数据,当max_trx_id超过了2的48次方时,max_trx_id的值,有会从0开始循环。关于mysql中其他的自增id介绍,可以参考mysql中的自增id超出上限的问题

对于trx_id的介绍,我们分以下3部分。

1.trx_id是什么时候获取的?

通过上文我们知道,trx_id的值是max_trx_id的当前值。事务通常是在先执行读写语句的时候才会启动。具体如下图:

在这里插入图片描述

t2时刻 trx_id的值为空。
t3时刻 trx_id的值为 281475252293752。
t4时刻 trx_id的值为 48245。

这里有一个奇怪的现象,一个事务有两个不同的trx_id, 而且第一个是一个比较大的值,第二个是一个相对较小的值?

出现这个现象的原因,主要是因为Innodb的一个优化:max_trx_id只会给更新事务分配trx_id。

因为在t2时刻,事务中没有涉及到更新操作,此时的事务只是一个只读事务,因为只读事务不会对数据产生任何影响,事务id也没有太大的意义。所以对于只读事务id的分配,不会使用max_trx_id的值,也不会使max_trx_id的值自增。而这个很大的trx_id,是innodb使用当前事务的trx变量的地址转换成整数,然后在加上2的48次方计算得来的。这种计算方式,计算出来的trx_id值会比较大,刚好可以和更新事务做区分,同时不同的事务trx变量的地址值也是不同的,所以只读事务trx_id一般情况下,也是不会相同。

这种优化方案,可以减少trx_id申请的次数,所以max_trx_id增加的速度也就变慢了,同时也减少了trx_id申请过程中锁冲突的几率。

2.trx_id有什么用

在Innodb中数据可见性的核心思想就是,每一行数据都记录着对其进行更新操作的事务id。当一个查询读到一行数据的时候,判断这个数据可见性的逻辑就是通过事务的一致性视图与这行数据的trx_id做对比。以可重复读事务隔离级别为例,事务可见性规则如下:
在可重复读的事务隔离级别下,为了实现数据的可见性,在一个事务启动的时刻,会为这个事务创建一个事务数组,这个数组存放了这个事务启动那一时刻,系统中活跃的所有事务,这里活跃可以理解成已经启动,单未提交的事务,其中数组中trx_id最小的那个事务,被称为低水位线,当前系统中已经创建的事务id的最大值加1记为高水位,具体如下图:
在这里插入图片描述

其中中间的黄色部分,就是当前事务创建的事务数组。绿色部分为trx_id小于低水位线且已经提交的事务。而红色部分,表示trx_id高于高水位线的事务,也就是对于当前事务来说的未来事务。

其中,绿色部分和红色部分都比较好理解,而对于黄色部分,还需要额外在多说一点,trx_id大于低水位线,且未提交的事务,存放在黄色部分,这个没什么好说的,但是需要注意的是,“晚启动的事务不一定晚提交”,所以可能存在一些事务,他们的trx_id大于低水位线,小于高水位线,但是已经提交了,其实这部分事务从数值上来说,应该属于黄色部分。

在innodb中判断数据可见性时,有以下规则:绿色部分的事务可见,红色部分的数据不可见,黄色部分中的数据,如果已经提交了,可见,未提交的话,则不可见。

3.trx_id越界了怎么处理

上文提到,如果max_trx_id的值超过了2的48次方后,会重新从0开始循环。根据可重复读事务隔离级别下,事务可见性规则,事务id从0开始循环后,新的事务id会小于当前事务视图的低水位线,也就是本来属于红色区域部分的事务,结果落到了绿色部分。导致当前视图可以看到"未来"事务的更新,也就破坏了上图中,红色区域事务不可见的规则。也就出现了脏读的问题。

不幸的是,mysql并没有对这个问题进行修复。虽然当max_trx_id达到上限后,对mysql影响很严重,但是,要到达这个上限也很难,这个问题通常也只有理论上会发生。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:27:52  更:2021-11-20 18:29:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:16:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码