Skip to content

Menu
Menu

事务ID分配时间

Posted on 2022年2月13日2022年7月5日 by zhezimi

我们一般会用start transaction或begin开始一个事务,自然而言的我们认为在这个时候就已经分配了一个事务ID,其实并不是这样,我们下面来看一个案例

首先我们添加测试数据

mysql> create table test (id int not null default 0)engine=innodb;

Query OK, 0 rows affected (0.03 sec)

mysql> insert into test select 1;

Query OK, 1 row affected (0.00 sec)

Records: 1 Duplicates: 0 Warnings: 0

mysql> insert into test select 2;

Query OK, 1 row affected (0.00 sec)

Records: 1 Duplicates: 0 Warnings: 0

我们开启两个客户端,分别为session1和session2,事务隔离级别为RR

大家心里会有个疑问,为什么我sessio1先开启的事务,但session2事务提交后,我还能看到了,这不成了不可重复读了吗,其实很简单,那是因为session1的start transaction;并没有分配事务ID,到第6步的时候才分配,所以session1的trx_id>session2.trx_id,所以看到session2提交的数据这就很正常了。

那么大家就会有疑问,RR隔离级别在什么时候才会分配事务ID呢,有两种方法分配:

  1. start transaction; 后面的第一个SQL语句
  2. 要不就以这种方式开启一个事务 START TRANSACTION WITH CONSISTENT SNAPSHOT;

下面我们来试下第一种方法,  我们把id=100的还是改为1来做测试

这时候session1查出来的值还是1,但是因为我们在第3步已经为session1分配了trx_id,而session2在step4才分配,因此session1.trx_id<session2.trx_id,所以就算session2提交了,session1也看不到。

下面我们来试下第二种方法

还是没看到session2修改后的100,那说明START TRANSACTION WITH CONSISTENT SNAPSHOT;就会分配事务ID

提示:

什么时候分配事务ID,可以通过监控这个表的记录  select * from information_schema.INNODB_TRX;每执行一步就看下数据,那么就自然而然的知道是什么时候分配的事务ID了

相关文章

  • 衡量SQL查询的三个指标

  • 如何删除大表

  • 备份与恢复

  • 字符集设置

  • 数据类型:JSON

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

近期文章

  • 排查网络故障常用命令
  • PHP-FPM异常问题
  • RabbitMQ 1:介绍
  • 观察者模式
  • 装饰者模式

近期评论

没有评论可显示。

分类

  • cdn
  • css
  • docker
  • git
  • http
  • javascript
  • linux
  • mysql
  • nginx
  • php
  • RabbitMQ
  • 代码规范
  • 性能
  • 正则表达式
  • 网络协议
  • 设计模式
© 2025 | Powered by Minimalist Blog WordPress Theme