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影响很严重,但是,要到达这个上限也很难,这个问题通常也只有理论上会发生。

mysql中事务id,有啥用?相关推荐

  1. mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...

  2. mysql 事物的持久性是指_详解MySQL中事务的持久性实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什 ...

  3. MySQL中事务的持久性实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什 ...

  4. MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论

      MySQL ACMAIN_CHM 06-26 16:36 等级 84次回复 [求证&散分]MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论 庆祝本月大 ...

  5. 14、mysql中事务的应用

    是什么 事务是一种保护连续操作同时满足(实现)的一种机制,用来保护数据的完整性,只适用于数据操作,不适用于结构操作,只有 innodb引擎的表具有事务安全的机制.就是说,在一个事务中做一系列的sql操 ...

  6. limit实现原理 mysql_解读数据库:深入分析MySQL中事务以及MVCC的实现原理

    什么是事务 事务(Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元. 在同一个事务中所进行的操作,要么都成功,要么就什么都不做.理想中的事务必须满足四大特 ...

  7. Mysql中事务是什么?有什么用?

    通过这一篇文章让你彻底了解事务,文章当中提供了很多真实示例,供大家参考学习! 目录 一.什么是事务? 二.事务操作 1.没有事务会出现什么场景? 2.控制事务方式一(手动提交) 3.控制事务方式二(通 ...

  8. MySQL 中事务的实现原理全解析

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝 ...

  9. MySQL中事务的提交和回滚机制

    应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码: 2 连接数据库,验证密码: 3 验证成功,获得用户信息,比如存款余额等: 4 用户输入需要取款的金额,按下确认键: ...

最新文章

  1. CUDA入门(三) 初探线程与块
  2. 9.1 图像处理的基本概念(图像读入、图像信息查询、图像显示和图像存储)
  3. 5月份升级鸿蒙系统的华为手机名单,鸿蒙OS前三批升级名单曝光,华为荣耀手机可升级,幸福来得太突然...
  4. AI:**消灭程序员需要一百年吗?
  5. candence 16.6 win8.1 x64 破解
  6. c ++查找字符串_C ++类和对象| 查找输出程序| 套装4
  7. Nginx服务架构初探(七):nginx邮件服务
  8. AndroidStudio_报错PluginApplicationException: Failed to apply plugin [id ‘com.and---Android原生开发工作笔记227
  9. 语音识别实验报告.docx
  10. Ubuntu20.04安装WPS
  11. STM32串口接收以及发送大全
  12. 电子商务概论【0351】
  13. Java定时任务调度框架
  14. 调用讯飞开放平台的语音转写api
  15. 263企业邮箱:客户端授权码登录
  16. CountDownLatch并发编程
  17. oracle 时间天数计算,oracle计算连续登陆/上班天数
  18. C语言程序员未来发展前景如何
  19. 图像识别流程学习总结
  20. Python创建自己的聊天机器人

热门文章

  1. 什么是 Linux Mint,它比 Ubuntu 好在哪里?
  2. Linux下Apache服务的部署和配置
  3. 用c#读取并分析sql2005日志
  4. 【二、八、十、十六】进制转换详解
  5. 纯视觉3D目标检测新SOTA!STS:基于Camera的深度估计新方法
  6. 正则 负数 python_【记录】Python推特爬虫思路
  7. 【Java】实现统计字符串中大写、小写、数字字符出现次数
  8. Android使用高德地图地理围栏定位自动发送短信
  9. 【前端】JavaScript基础(二)
  10. Flash Builder常见菊紧问题集锦