如何防止SQL同时运行事务

时间:2012-08-14 21:44:14

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

我注意到MS SQL可能在上一个事务完成(或提交)之前开始另一个事务。有没有办法确保交易必须在下一次交易开始之前完成?

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

当我使用SQL事件探查器跟踪此场景时,我注意到SQL INSERT和SELECT同时执行,就像SELECT在INSERT完成之前发生一样。

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

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

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

你是否被锁定在MSSQL中?