我注意到 MS SQL 可能在前一个事务完成(或提交)之前开始另一个事务。有没有一种方法可以确保交易必须在下一个交易开始之前首先完成?
我的问题是我想在 SQL INSERT 之后几乎立即执行 SQL SELECT。我现在看到的是;当 SELECT 语句运行时;它不会返回(非常)最近插入的数据。
当我使用 SQL 分析器跟踪此场景时,我注意到 SQL INSERT 和 SELECT 同时执行,因为 SELECT 发生在 INSERT 完成之前。
有没有办法解决我的这个问题?谢谢!
我注意到 MS SQL 可能在前一个事务完成(或提交)之前开始另一个事务。有没有一种方法可以确保交易必须在下一个交易开始之前首先完成?
我的问题是我想在 SQL INSERT 之后几乎立即执行 SQL SELECT。我现在看到的是;当 SELECT 语句运行时;它不会返回(非常)最近插入的数据。
当我使用 SQL 分析器跟踪此场景时,我注意到 SQL INSERT 和 SELECT 同时执行,因为 SELECT 发生在 INSERT 完成之前。
有没有办法解决我的这个问题?谢谢!
从它的声音来看,您正在寻找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());
您可以在SERIALIZABLE
隔离级别运行事务。这样,您将确保在插入之后执行选择。在较低的隔离级别中,选择是并行执行的,并返回数据的快照——在发出选择的事务启动之前,所有事务都已完成,这是一种查看方式。
我猜你想在插入后得到一个自动生成的标识符?我不确定执行此操作的 MSSQL 方式,但在 PostgreSQL 中,有 INSERT ... RETURNING 扩展来解决这个问题。
http://www.postgresql.org/docs/9.1/static/sql-insert.html
您是否被锁定在 MSSQL 中?