- 我们一般会用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了
相关文章
- 02-21loadrunner 事务、同步点和思考时间
- 02-21事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品
- 02-21Sqlserver 利用时间戳 + 自增长ID 生成流水号 模拟并发请求生成重复ID 解决方法
- 02-21LoadRunner几个重要的概念:事务、集合点、思考时间
- 02-21事务ID分配时间
- 02-21在阻塞式io中,如果一个线程在等待io操作,那么cpu还会分配时间片给该线程吗?
- 02-21物料事务处理接口表 MTL_TRANSACTIONS_INTERFACE 账户别名使用 及 提示无效的分配账户字段
- 02-21写一个产生16位纯数字唯一 ID 的方法,要求时间因素的介入。(不要求绝对唯一,在一定的时空中重复机率很小即可)
- 02-21SqlException 事务(进程 ID 159)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
- 02-21自动创建创建用户id,创建时间,修改用户id,修改时间