在单个MySql会话中是否有保证的查询顺序?

时间:2012-12-08 22:30:52

标签: mysql sql

给定单个MySql会话,假设查询A执行对表的读取,并且查询B对表执行写操作,这将影响查询A将返回的内容。

如果我在查询B之后提交了查询A(可能是几毫秒之后),结果是否确定?查询B是否可以在查询A之前完成?

或者,如果订单是[查询B,查询A],是否可以保证查询A的结果将包含在查询B中完成的更改?

2 个答案:

答案 0 :(得分:0)

您所询问的内容在某种程度上取决于所使用的表类型,以及查询是在同一个线程中还是来自多个会话。有关此问题的完整讨论,请参阅MySQL documentation,特别是关于“锁定”的主题。

如果这些查询是由同一个脚本执行的,那么可能不会有问题。查询B不会影响查询A等的结果

来自文档...

  

MySQL对MyISAM,MEMORY和MERGE表使用表级锁定,   BDB表的页级锁定和InnoDB的行级锁定   表。

     

在许多情况下,您可以对有关哪种锁定类型进行有根据的猜测   最适合应用程序,但通常很难说   给定的锁定类型比另一种更好。一切都取决于   申请和申请的不同部分可能需要   不同的锁类型。

     

决定是否要使用具有行级别的存储引擎   锁定,你应该看看你的应用程序做了什么,以及什么组合   选择并更新它使用的语句。例如,大多数Web   应用程序执行许多选择,相对较少的删除,更新   主要基于键值,并插入到几个特定的​​表中。   基本的MySQL MyISAM设置已针对此进行了很好的调整。

     

MySQL中的表锁定对于使用的存储引擎来说是无死锁的   表级锁定。永远管理死锁避免   在查询开始时立即请求所有需要的锁   总是以相同的顺序锁定表。

答案 1 :(得分:0)

如果您正在讨论单个会话,请注意MySQL不支持多个并发查询。您必须在执行查询B之前完成读取查询A.

某些客户端界面使得您仍然可以从查询A中获取结果,即使您已经继续执行查询B.但这是可能的,因为客户端库已经将查询A中的所有结果提取到应用程序内存中,以及你在代码中看到的随后的提取实际上只是在内存中迭代结果。

如果您正在谈论多个并发会话,那么@Ian Atkin的答案就会发挥作用。存储引擎和事务隔离级别可能会影响结果。