2012-08-14 73 views
0

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

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

当我使用SQL事件探查器追踪这个场景时,我注意到SQL INSERT和SELECT同时执行,因为SELECT在INSERT完成之前发生。

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

+3

交易不防止同时运行在寻找OUTPUT条款

从例子。你需要为此使用锁。 – 2012-08-14 21:45:34

+0

@ user1034912:'它不返回(非常)最近插入的数据.'它不会返回一半更新的数据(新旧)。您在插入之前获取数据,并且从一致性点view.If你想确保你得到更新后的数据,你需要使用锁,因为马克B说 – Cratylus 2012-08-14 21:52:05

+0

谢谢所有。马克B,我想找什么命令来获得锁? – user1034912 2012-08-14 22:00:14

回答

0

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

1

从它的声音,你的文档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()); 
相关问题