在SQL Server中,来自外部事务的INSERT是对内部事务可见的' SELECT语句?

时间:2014-06-10 16:02:36

标签: sql sql-server stored-procedures transactions

如果我从存储过程中调用存储过程(两者都开始并提交事务),内部存储过程是否能够看到已执行但未提交的INSERT,通过外部程序?更一般地说,如何使用嵌套过程和事务处理范围?我能找到的大多数内容都是关于回滚和错误处理的,我还不太关心。

我有一个基本上执行以下操作的应用程序,并且它没有从内部过程中找到新插入的记录:

CREATE PROCEDURE Proc1 AS
BEGIN
    BEGIN TRANSACTION
        INSERT INTO T1 (Data) VALUES (100)
        EXEC Proc2
    COMMIT
END

CREATE PROCEDURE Proc2 AS
BEGIN
    BEGIN TRANSACTION
        IF NOT EXISTS ( SELECT 1 FROM T1 WHERE Data = 100 )
            PRINT 'Record does not exist.'
    COMMIT
END

1 个答案:

答案 0 :(得分:0)

SQL Server不支持嵌套事务。当您执行第二次begin transaction时,所有发生的事情都是@@TRANCOUNT变量增加。提交不会将@@TRANCOUNT减少为零does nothing

所以“内部”交易实际上是“一个”交易的一部分。他们可以从调用过程中看到未提交的更改。

如果我在自己的计算机上运行您的代码,Proc2能够看到Proc1插入的记录就好了。