事务ID分配时间
作者:互联网
- 我们一般会用start transaction或begin开始一个事务,自然而言的我们认为在这个时候就已经分配了一个事务ID,其实并不是这样,我们下面来看一个案例
- 首先我们添加测试数据
- 我们开启两个客户端,分别为session1和session2,事务隔离级别为RR
- 大家心里会有个疑问,为什么我sessio1先开启的事务,但session2事务提交后,我还能看到了,这不成了不可重复读了吗,其实很简单,那是因为session1的start transaction;并没有分配事务ID,到第5步的时候才分配,所以session1.trx_id>session2.trx_id,所以看到session2提交的数据这就很正常了
- 那么大家就会有疑问,RR隔离级别在什么时候才会分配事务ID呢,有两种方法分配
- start transaction; 后面的第一个select
- 要不就以这种方式开启一个事务 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了
标签:事务,session1,session2,分配,ID,id 来源: https://blog.51cto.com/itzhoujun/2365607