MYSQL的读提交隔离将返回哪个版本的记录

MYSQL的读提交隔离将返回哪个版本的记录,mysql,Mysql,我有一个场景,其中我的集群处于读取提交隔离模式,用例如下所示: 执行select语句时,运行查询并返回响应大约需要1分钟 在此期间,可以在1分钟的时间范围内更新(提交)数据 所以我的问题是我会在回复中得到更新的记录还是旧记录?? 我读了,上面提到任何幻影读取都是允许的 我在这里很困惑,所以只想澄清一下,请帮忙 Using READ COMMITTED has additional effects(Reference MYSQL docs): 对于UPDATE或DELETE语句,InnoDB仅为

我有一个场景,其中我的集群处于读取提交隔离模式,用例如下所示:

执行select语句时,运行查询并返回响应大约需要1分钟

在此期间,可以在1分钟的时间范围内更新(提交)数据

所以我的问题是我会在回复中得到更新的记录还是旧记录?? 我读了,上面提到任何幻影读取都是允许的

我在这里很困惑,所以只想澄清一下,请帮忙

Using READ COMMITTED has additional effects(Reference MYSQL docs):
  • 对于UPDATE或DELETE语句,InnoDB仅为行持有锁 更新或删除。不匹配行的记录锁为 在MySQL评估WHERE条件后发布。这非常重要 减少死锁的可能性,但死锁仍然可能发生

  • 对于UPDATE语句,如果行已被锁定,InnoDB将执行 “半一致”读取,将最新提交的版本返回给 MySQL,以便MySQL可以确定行是否与WHERE匹配 更新的条件。如果行匹配(必须更新),MySQL 再次读取该行,这一次InnoDB将其锁定或等待 为了锁上它


  • 数据的并发更新无法在给定查询执行时修改该查询。这就好像每个查询都在其自己的可重复读取快照中运行,即使事务已被读取提交

    它将返回在语句开始执行时已提交的行。它将不包括语句开始后提交的任何行


    请回复您的评论:

    不,没有事务隔离级别可以改变这一点。即使使用readuncommitted,给定查询也只读取在查询开始执行时提交的行

    如果要查询最近的更新,只能通过启动新查询来完成

    如果您担心没有收到有关最近更新的通知,那么您需要优化查询,这样执行查询就不会花费60秒

    这听起来像是在轮询数据库。频繁运行昂贵的查询以轮询数据库表明您可能需要使用消息队列


    这是你的第二个评论:

    锁定SQL语句(包括UPDATE和DELETE)以及锁定SELECT语句的功能与READ COMMITED类似,即使事务是可重复读取的。锁定语句始终读取在语句启动时提交的最近一行

    但它们仍然无法读取语句启动后提交的新行。如果没有其他原因,他们无法获得这些行上的锁

    您最初的问题是关于SELECT语句的,我假设您指的是非锁定SELECT(即,在共享模式下没有FOR UPDATE或LOCK选项)。这些SELECT语句也无法查看SELECT启动后添加的行



    另外,我从未发现READ UNCOMMITTED可用于任何目的。

    数据的并发更新无法在给定查询执行时修改该查询。这就好像每个查询都在其自己的可重复读取快照中运行,即使事务已被读取提交

    它将返回在语句开始执行时已提交的行。它将不包括语句开始后提交的任何行


    请回复您的评论:

    不,没有事务隔离级别可以改变这一点。即使使用readuncommitted,给定查询也只读取在查询开始执行时提交的行

    如果要查询最近的更新,只能通过启动新查询来完成

    如果您担心没有收到有关最近更新的通知,那么您需要优化查询,这样执行查询就不会花费60秒

    这听起来像是在轮询数据库。频繁运行昂贵的查询以轮询数据库表明您可能需要使用消息队列


    这是你的第二个评论:

    锁定SQL语句(包括UPDATE和DELETE)以及锁定SELECT语句的功能与READ COMMITED类似,即使事务是可重复读取的。锁定语句始终读取在语句启动时提交的最近一行

    但它们仍然无法读取语句启动后提交的新行。如果没有其他原因,他们无法获得这些行上的锁

    您最初的问题是关于SELECT语句的,我假设您指的是非锁定SELECT(即,在共享模式下没有FOR UPDATE或LOCK选项)。这些SELECT语句也无法查看SELECT启动后添加的行



    另外,我从未发现READ UNCOMMITTED在任何用途上都有很好的用途。

    默认情况下,INNOBD会在处理过程中锁定表,但有一些方法可以执行解锁选择。在这种情况下,它将在表的版本化快照上运行,因此处理过程中的任何提交都不会改变结果

    有关更多信息:


    在所有情况下,数据库的ACID属性都将始终防止不稳定的函数:

    默认情况下,INNOBD将在处理过程中锁定表,但有一些方法可以执行未锁定的选择。在这种情况下,它将在表的版本化快照上运行,因此处理过程中的任何提交都不会改变结果

    有关更多信息:


    在任何情况下,数据库的ACID属性都将始终防止不稳定的函数:

    如果我也需要这些更改,我应该使用read uncommitted吗?它将允许脏读@Billmake,这对我来说是有意义的,我编辑了我的帖子,并添加了我实际上感到困惑的语句。你能澄清一下吗@Bill?如果我也需要这些更改,我应该使用read uncommitted吗?它将允许脏的重新提交