例如按照下面时间顺序执行
因为 B 查询的数据要求是 createdAt < B.version && (deletedAt > B.version || deletedAt = null)
那么在事务 B 中,第一次查询到的记录和第二次查询到的记录是不一样的
这个怎么解释?
![]() | 1 ixiaohei 2017-10-19 18:32:30 +08:00 版本号和回滚段保证可重复读。 |
![]() | 3 domty 2017-10-19 18:47:56 +08:00 Next-Key Lock |
4 namedfish 2017-10-19 19:18:05 +08:00 via iPhone 在隔离级别为可重复读的情况下可以保证,详情可以 google mysql 隔离级别设置 |
![]() | 5 ixiaohei 2017-10-19 20:13:26 +08:00 @sunkuku 我说错了,mysql 的 mvvc 的可以保证重复读,但是幻读是间隙锁还是什么东西保证的,具体可以读 mysql 官方文档。 另外你说的读到另外新插入的行这个是幻读,不是可重复读,可重复读这个隔离级别不保证幻读的。但是 mysql 可重复度貌似解决幻读(当时读文档很是因垂丝丁) |
![]() | 6 sunkuku OP |
![]() | 7 sunkuku OP |
![]() | 8 ixiaohei 2017-10-23 17:51:45 +08:00 @sunkuku 你要研究深,还有个快照读和当前读区别,一般 mvcc 只是保证快照读可重复读,另外当前读应该就是间隙锁保证的(这个我不是很了解) |
![]() | 9 sunkuku OP 这个是 MVCC 实现原理的文章,放在团队博客上了 http://fridaytalk.org/archives/20/ |