MYSQL的读提交隔离将返回哪个版本的记录
我有一个场景,其中我的集群处于读取提交隔离模式,用例如下所示: 执行select语句时,运行查询并返回响应大约需要1分钟 在此期间,可以在1分钟的时间范围内更新(提交)数据 所以我的问题是我会在回复中得到更新的记录还是旧记录?? 我读了,上面提到任何幻影读取都是允许的 我在这里很困惑,所以只想澄清一下,请帮忙MYSQL的读提交隔离将返回哪个版本的记录,mysql,Mysql,我有一个场景,其中我的集群处于读取提交隔离模式,用例如下所示: 执行select语句时,运行查询并返回响应大约需要1分钟 在此期间,可以在1分钟的时间范围内更新(提交)数据 所以我的问题是我会在回复中得到更新的记录还是旧记录?? 我读了,上面提到任何幻影读取都是允许的 我在这里很困惑,所以只想澄清一下,请帮忙 Using READ COMMITTED has additional effects(Reference MYSQL docs): 对于UPDATE或DELETE语句,InnoDB仅为
Using READ COMMITTED has additional effects(Reference MYSQL docs):
数据的并发更新无法在给定查询执行时修改该查询。这就好像每个查询都在其自己的可重复读取快照中运行,即使事务已被读取提交 它将返回在语句开始执行时已提交的行。它将不包括语句开始后提交的任何行
请回复您的评论: 不,没有事务隔离级别可以改变这一点。即使使用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吗?它将允许脏的重新提交