首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可重复阅读:哪一个是正确的?

可重复阅读:哪一个是正确的?
EN

Database Administration用户
提问于 2017-02-23 05:34:46
回答 2查看 1.7K关注 0票数 4

哪一个是对的?

  1. 使用事务1作为可重复读取,其他事务在事务1选择行后无法更新该行。
  2. 使用事务1作为可重复读取,其他事务可以更新行,但事务1没有考虑到这些更改。

我以前相信(1)是对的。但是当我在机器上测试样本事务时,(2)是正确的。我使用的是MySQL版本5.1.2.re社区。

EN

回答 2

Database Administration用户

发布于 2017-02-23 19:48:12

虽然许多数据库系统的行为实际上与您的第一个版本类似,但是对于MySQL,版本2是预期的行为,请参阅有关可重复读的文档:

这是InnoDB的默认隔离级别。在同一事务中进行一致读取,读取由第一次读取建立的快照。这意味着,如果在同一事务中发出几个普通(非锁定) SELECT语句,这些SELECT语句也是一致的。

这意味着:如果您是同一行的select,则获得相同的数据(从快照),即使该行已被另一个事务删除。这正是sql标准所要求的:它必须防止“不可重复的读取”(除了更低隔离级别的“脏读”),但是每个数据库系统都可以在细节上不同地实现它。

在MySQL中,如果您想阻止另一个事务更新repeatable read中的行,则需要通过例如使用select ... for update来锁定它们。除非您处于select隔离模式,否则简单的serializable不会放置锁。

票数 3
EN

Database Administration用户

发布于 2019-10-12 21:54:52

如果数据库使用多版本并发控制,那么2是正确的。但是,如果它使用两相锁相,那么1是正确的。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/165259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档