我注意到MS SQL可能会在前一个事务完成(或已提交)之前开始另一个事务。有什么方法可以确保交易在下一次交易开始前必须先完成?如何防止SQL同时运行事务
我的问题是,我想在SQL INSERT后几乎立即执行SQL SELECT。我现在看到的是;当SELECT语句运行时;它不会返回(非常)最近插入的数据。
当我使用SQL事件探查器追踪这个场景时,我注意到SQL INSERT和SELECT同时执行,因为SELECT在INSERT完成之前发生。
有没有办法解决我的这个问题?谢谢!
我注意到MS SQL可能会在前一个事务完成(或已提交)之前开始另一个事务。有什么方法可以确保交易在下一次交易开始前必须先完成?如何防止SQL同时运行事务
我的问题是,我想在SQL INSERT后几乎立即执行SQL SELECT。我现在看到的是;当SELECT语句运行时;它不会返回(非常)最近插入的数据。
当我使用SQL事件探查器追踪这个场景时,我注意到SQL INSERT和SELECT同时执行,因为SELECT在INSERT完成之前发生。
有没有办法解决我的这个问题?谢谢!
我猜你想在插入后得到一个自动生成的标识符?我不确定MSSQL的方式来做到这一点,但在PostgreSQL中,有INSERT ... RETURNING扩展来解决这个问题。
http://www.postgresql.org/docs/9.1/static/sql-insert.html
你锁定为MSSQL?
您可以在SERIALIZABLE
隔离级别运行您的事务。这样你将确保选择将在插入后执行。在较低的隔离级别中,选择是以并行方式执行的,并返回数据的快照 - 在所有事务选择已启动之前完成所有事务的方式。
从它的声音,你的文档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());
交易不防止同时运行在寻找
OUTPUT
条款从例子。你需要为此使用锁。 – 2012-08-14 21:45:34
@ user1034912:'它不返回(非常)最近插入的数据.'它不会返回一半更新的数据(新旧)。您在插入之前获取数据,并且从一致性点view.If你想确保你得到更新后的数据,你需要使用锁,因为马克B说 – Cratylus 2012-08-14 21:52:05
谢谢所有。马克B,我想找什么命令来获得锁? – user1034912 2012-08-14 22:00:14