给定单个MySql会话,假设查询A执行对表的读取,并且查询B对表执行写操作,这将影响查询A将返回的内容。
如果我在查询B之后提交了查询A(可能是几毫秒之后),结果是否确定?查询B是否可以在查询A之前完成?
或者,如果订单是[查询B,查询A],是否可以保证查询A的结果将包含在查询B中完成的更改?
答案 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的答案就会发挥作用。存储引擎和事务隔离级别可能会影响结果。