我之前知道 InnoDB 实现的可重复读级别可以解决大部分情况下幻读的问题。
然后我看书的时候,看到书里对 InnoDB 的 MVCC 的描述是基于事务开始时系统的版本号。
每开始一个事务,系统版本号都会递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看一下在 REPEATABLE READ 隔离级别下,MVCC 具体是如何操作的。 SELECT InnoDB 会根据以下两个条件检查每行记录: a. InnoDB 只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。 ...
问题来了,想问书里的描述:_这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的_。
这个是怎么确保的?
因为描述中写了事务的 id 是在开始时决定的。那如果事务开始时,有一个旧的事务还没结束呢?然后事务先读取了一行数据(不使用当前读启用 next-key lock 的情况下),旧的事务又修改了这行数据,然后提交,然后事务又读了这行数据,那是不是就出现幻读了呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.