如何防止SQL同时运行事务
我注意到,MS SQL可能会在前一个事务完成(或提交)之前开始另一个事务。我们有没有办法确保在下一笔交易开始之前必须先完成一笔交易 我的问题是,我希望在SQL插入之后几乎立即执行SQL选择。我现在看到的是;运行SELECT语句时;它不会返回(最近)插入的数据 当我使用SQLProfiler跟踪这个场景时,我注意到SQLINSERT和SELECT同时执行,就像SELECT在插入完成之前发生一样如何防止SQL同时运行事务,sql,sql-server,select,transactions,transaction-isolation,Sql,Sql Server,Select,Transactions,Transaction Isolation,我注意到,MS SQL可能会在前一个事务完成(或提交)之前开始另一个事务。我们有没有办法确保在下一笔交易开始之前必须先完成一笔交易 我的问题是,我希望在SQL插入之后几乎立即执行SQL选择。我现在看到的是;运行SELECT语句时;它不会返回(最近)插入的数据 当我使用SQLProfiler跟踪这个场景时,我注意到SQLINSERT和SELECT同时执行,就像SELECT在插入完成之前发生一样 有办法解决我的这个问题吗?谢谢 我猜您想在插入后获得自动生成的标识符吗?我不确定MSSQL是如何做到这一
有办法解决我的这个问题吗?谢谢 我猜您想在插入后获得自动生成的标识符吗?我不确定MSSQL是如何做到这一点的,但在PostgreSQL中,有INSERT。。。返回扩展来解决这个问题
您是否锁定在MSSQL中?您可以在
可序列化的隔离级别运行事务。这样,您将确保在插入后执行选择。在较低的隔离级别中,select以并行方式执行并返回数据的快照—这是在发出select之前完成的所有事务中看到的方式。从它的声音中,您正在寻找输出
子句
根据文档中的示例
事务不会阻止同时运行。您需要使用锁。@user1034912:它不会返回(最近)插入的数据。
。它也不会返回半更新的数据(旧数据和新数据)。您在插入之前获取数据,从一致性的角度来看,这是有效的。如果你想确保在更新后获得数据,你需要使用锁,正如Marc B所说的Hanks All。Marc B,我在找什么命令来获得锁?在进行选择时,你可以插入行吗?如果没有,我想你可能得锁上整个桌子。。。由于并发性能问题,这是非常糟糕的。您想要实现什么,需要这种锁定?
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());