如何防止SQL同时运行事务

如何防止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是如何做到这一

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

我的问题是,我希望在SQL插入之后几乎立即执行SQL选择。我现在看到的是;运行SELECT语句时;它不会返回(最近)插入的数据

当我使用SQLProfiler跟踪这个场景时,我注意到SQLINSERT和SELECT同时执行,就像SELECT在插入完成之前发生一样


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

我猜您想在插入后获得自动生成的标识符吗?我不确定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());