哪一个是对的?
我以前相信(1)是对的。但是当我在机器上测试样本事务时,(2)是正确的。我使用的是MySQL版本5.1.2.re社区。
发布于 2017-02-23 19:48:12
虽然许多数据库系统的行为实际上与您的第一个版本类似,但是对于MySQL,版本2是预期的行为,请参阅有关可重复读的文档:
这是InnoDB的默认隔离级别。在同一事务中进行一致读取,读取由第一次读取建立的快照。这意味着,如果在同一事务中发出几个普通(非锁定) SELECT语句,这些SELECT语句也是一致的。
这意味着:如果您是同一行的select,则获得相同的数据(从快照),即使该行已被另一个事务删除。这正是sql标准所要求的:它必须防止“不可重复的读取”(除了更低隔离级别的“脏读”),但是每个数据库系统都可以在细节上不同地实现它。
在MySQL中,如果您想阻止另一个事务更新repeatable read中的行,则需要通过例如使用select ... for update来锁定它们。除非您处于select隔离模式,否则简单的serializable不会放置锁。
https://dba.stackexchange.com/questions/165259
复制相似问题