将多个SQL查询排队为一个字符串,服务器行为?

时间:2011-07-15 23:52:04

标签: mysql sql sql-server tsql queue

当你有例如。连续3个查询作为单个字符串提交给SQL数据库,以分号分隔,另一个用户同时执行完全相同的操作,我们的查询将被视为查询的“组”或“队列”它将始终以每个用户的相同逻辑顺序执行,或者这些查询的队列是否会“混淆”,最终我们的查询被逐个触发?

所以基本上我想知道在发生这种情况时,MySQL和SQL Server会出现以下哪种情况:

  • 执行路径情况1

  • 用户1查询1,用户1查询2,用户1查询3,用户2查询1,用户2查询2,用户2查询3

  • 执行路径情况2

  • 用户1查询1,用户2查询1,用户1查询2,用户2查询2,用户1查询3,用户2查询3

3 个答案:

答案 0 :(得分:1)

它取决于数据库引擎,到位的锁定机制,事务和其他因素。真的,没关系...只要它们都是选择查询。如果部分或全部查询包含写入操作,则应将每个批处理包含在事务中以确保原子性。

答案 1 :(得分:1)

这取决于您的数据库是将其视为多个单独的查询还是单个事务。如果它将其视为交易,则订单无关紧要。如果要确保将其视为单个事务,可以通过方式向数据库发出信号,告知它应为查询创建事务。数据库(应该)确保四个基本属性(ACID):

  • Atomic - 整个交易成功或失败。
  • Consist - 无论事务成功还是失败,数据库都将始终保持一致状态。
  • 隔离 - 同时处理的多个交易不会相互干扰。
  • 持久 - 数据库必须能够在软件和硬件故障后恢复已提交的数据。

隔离是与您的案例相关的隔离。您的查询不应该破坏他人的查询,因此您不必担心其他用户同时提交查询。

另外,我怀疑你的数据库是在一个处理器上运行的。您描述的线性路径可能不会仅仅因为数据库可以同时处理多个查询而发生。

为安全起见,我将使用BEGIN TRANSACTION开始查询,并以COMMIT TRANSACTION(或数据库所需的任何语法)结束。如果数据库确实将其视为多个单独的查询,则在写入数据库时​​可能会出现问题。最好使用交易。

答案 2 :(得分:0)

对于SQL Server,特定用户的查询将按指定的顺序运行,但它们可以与其他用户的语句交错,具体取决于资源何时可用。在事务内部,您可以保证数据的一致性,但您的语句仍然可能与其他用户的语句交错。您使用的语句和锁的类型将决定其他语句是否能够访问您在查询中使用的相同表和行。