【问题标题】:How do I prevent SQL from running transactions simultaneously如何防止 SQL 同时运行事务
【发布时间】:2012-08-14 21:44:13
【问题描述】:

我注意到 MS SQL 可能会在前一个事务完成(或提交)之前开始另一个事务。有什么方法可以确保交易必须在下一个交易开始之前先完成?

我的问题是我想在 SQL INSERT 之后几乎立即执行 SQL SELECT。我现在看到的是;当 SELECT 语句运行时;它不会返回(非常)最近插入的数据。

当我使用 SQL 分析器跟踪此场景时,我注意到 SQL INSERT 和 SELECT 同时执行,因为 SELECT 发生在 INSERT 完成之前。

有没有办法解决我的这个问题?谢谢!

【问题讨论】:

  • 事务不会阻止同时运行。你需要为此使用锁。
  • @user1034912:it does not return the (very) recently inserted data.。它也不返回半更新的数据(旧的新的)。您在插入之前获取数据,从一致性的角度来看这是有效的。如果您想要确保你在更新后得到数据,你需要像 Marc B 所说的那样使用锁
  • 谢谢大家。 Marc B,我在寻找什么命令来获得锁?
  • 是否允许在 select 发生时插入行?如果没有,我认为您可能必须锁定整个表...从并发性能问题来看,这真的很糟糕。你想要完成什么,你需要这种锁定?

标签: sql sql-server select transactions transaction-isolation


【解决方案1】:

从它的声音来看,您正在寻找OUTPUT 子句

来自文档http://msdn.microsoft.com/en-us/library/ms177564.aspx中的示例

DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

【讨论】:

    【解决方案2】:

    您可以在SERIALIZABLE 隔离级别运行您的事务。这样,您将确保在插入之后执行选择。在较低的隔离级别中,选择是并行执行的,并返回数据的快照——在发出选择的事务开始之前,所有事务都已完成。

    【讨论】:

      【解决方案3】:

      我猜您想在插入后取回自动生成的标识符?我不确定 MSSQL 的方式来做到这一点,但在 PostgreSQL 中,有 INSERT ... RETURNING 扩展来解决这个问题。

      http://www.postgresql.org/docs/9.1/static/sql-insert.html

      你被 MSSQL 锁定了吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 2015-09-22
        • 2015-10-13
        • 2015-07-26
        • 2011-09-10
        • 1970-01-01
        • 2022-11-09
        相关资源
        最近更新 更多