事务ID分配时间

  • 我们一般会用start transaction或begin开始一个事务,自然而言的我们认为在这个时候就已经分配了一个事务ID,其实并不是这样,我们下面来看一个案例
  • 首先我们添加测试数据
  • 事务ID分配时间
  • 事务ID分配时间
  • 事务ID分配时间
  • 我们开启两个客户端,分别为session1和session2,事务隔离级别为RR
  • 事务ID分配时间
  • 大家心里会有个疑问,为什么我sessio1先开启的事务,但session2事务提交后,我还能看到了,这不成了不可重复读了吗,其实很简单,那是因为session1的start transaction;并没有分配事务ID,到第5步的时候才分配,所以session1.trx_id>session2.trx_id,所以看到session2提交的数据这就很正常了
  • 那么大家就会有疑问,RR隔离级别在什么时候才会分配事务ID呢,有两种方法分配
    1. start transaction; 后面的第一个select
    2. 要不就以这种方式开启一个事务 START TRANSACTION WITH CONSISTENT SNAPSHOT;
  • 下面我们来试下第一种方法, 我们把id=100的还是改为1来做测试
    • 事务ID分配时间
    • 这时候session1查出来的值还是1,但是因为我们在第3步已经为session1分配了trx_id,而session2在step4才分配,因此session1.trx_id<session2.trx_id,所以就算session2提交了,session1也看不到
  • 下面我们来试下第二种方法
    • 事务ID分配时间
    • 还是没看到session2修改后的100,那说明START TRANSACTION WITH CONSISTENT SNAPSHOT;就会分配事务ID
  • 提示:
    • 什么时候分配事务ID,可以通过监控这个表的记录 select * from information_schema.INNODB_TRX;每执行一步就看下数据,那么就自然而然的知道是什么时候分配的事务ID了
上一篇:PXC DDL 操作阻塞写


下一篇:show processlist命令与kill 线程