如果我从存储过程中调用存储过程(两者都开始并提交事务),内部存储过程是否能够看到已执行但未提交的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
答案 0 :(得分:0)
SQL Server不支持嵌套事务。当您执行第二次begin transaction
时,所有发生的事情都是@@TRANCOUNT
变量增加。提交不会将@@TRANCOUNT
减少为零does nothing。
所以“内部”交易实际上是“一个”交易的一部分。他们可以从调用过程中看到未提交的更改。
如果我在自己的计算机上运行您的代码,Proc2
能够看到Proc1
插入的记录就好了。