【问题标题】:queuing multiple SQL queries as one string, server behaviour?将多个 SQL 查询作为一个字符串排队,服务器行为?
【发布时间】:2011-07-15 23:52:03
【问题描述】:

当你有例如。连续 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

【问题讨论】:

    标签: mysql sql sql-server tsql queue


    【解决方案1】:

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

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

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

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

    为了安全起见,我会以BEGIN TRANSACTION 开始您的查询,并以COMMIT TRANSACTION (或您的数据库需要的任何语法)结束它。如果数据库确实将其视为许多单独的查询,那么如果它们对数据库进行任何写入,您可能会遇到问题。最好使用事务。

    【讨论】:

    • 只要是MySQL,就看所涉及的存储引擎。 MyISAM 引擎不是事务性的,因此本质上,每个查询都完全在单独的事务中执行。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-15
        • 2015-08-05
        • 2018-11-07
        • 2011-01-01
        • 2011-01-21
        • 1970-01-01
        • 2017-03-29
        相关资源
        最近更新 更多