多个存储过程中的事物问题

问题有点复杂。
假如我有叁个存储过程,每个存储过程中都显示申明了事物,当我依次调用这叁个存储过程,如果其中有一个存储过程中发生了错误,那么其它两个存储过程中的事物都要回滚,这样的如何做呢?
下面我把代码贴出来让大家看看。
SQL code
   
   
-- --------------第一个存储过程----------------- CREATE PROCEDURE TransProc_1 @PriKey INT , @CharCol CHAR ( 3 ), @error_out int output AS BEGIN TRANSACTION InProc_1 INSERT INTO TestTrans VALUES ( @PriKey , @CharCol ) INSERT INTO TestTrans VALUES ( @PriKey + 1 , @CharCol ) set @error_out = @@error COMMIT TRANSACTION InProc_1; GO -- ------------第二个存储过程------------------- CREATE PROCEDURE TransProc_2 @PriKey INT , @CharCol CHAR ( 3 ), @error_out int output AS BEGIN TRANSACTION InProc INSERT INTO TestTrans VALUES ( @PriKey , @CharCol ) INSERT INTO TestTrans VALUES ( @PriKey + 1 , @CharCol ) set @error_out = @@error COMMIT TRANSACTION InProc; GO -- ------------第叁个存储过程------------------- CREATE PROCEDURE TransProc_3 @PriKey INT , @CharCol CHAR ( 3 ), @error_out int output AS BEGIN TRANSACTION InProc INSERT INTO TestTrans VALUES ( @PriKey , @CharCol ) INSERT INTO TestTrans VALUES ( @PriKey + 1 , @CharCol ) set @error_out = @@error COMMIT TRANSACTION InProc; GO -- ------------------------------- BEGIN TRANSACTION OutOfProc; DECLARE @ERROR INT ; -- 依次调用这些存储过程 EXEC TransProc_1 10 , ' aaa ' , @error_out = @ERROR output EXEC TransProc_2 20 , ' ccc ' , @error_out = @ERROR output EXEC TransProc_3 30 , ' ccc ' , @error_out = @ERROR output -- 打印错误号 print ( @ERROR ) IF ( @ERROR <= 0 ) BEGIN PRINT ( ' 提交事物 ' ) COMMIT TRANSACTION OutOfProc; END ELSE BEGIN PRINT ( ' 事物回滚 ' ) ROLLBACK TRANSACTION OutOfProc; END GO


上面的代码运行肯定是不行的,不能达到我想要的效果,请问有什么方法可以解决我现在的问题呢?
============================================================================
问题答案:
BEGIN TRANSACTION OutOfProc;
DECLARE @ERROR INT,@ERROR_2 INT;
set @ERROR_2=0
set @ERROR=0
--依次调用这些存储过程
EXEC TransProc_1 12, 'aaa',@error_out=@ERROR output
set @ERROR_2=@ERROR_2+@ERROR
EXEC TransProc_2 22, 'bbb',@error_out=@ERROR output
set @ERROR_2=@ERROR_2+@ERROR
EXEC TransProc_3 30, 'ccc',@error_out=@ERROR output
set @ERROR_2=@ERROR_2+@ERROR
--打印错误号
print(@ERROR_2)
IF ( @ERROR_2 <= 0 ) BEGIN
    PRINT('提交事物')
    COMMIT TRANSACTION OutOfProc;
END ELSE BEGIN
    PRINT('事物回滚')
    ROLLBACK TRANSACTION OutOfProc;
END
GO
至于错误处理, 那是你在每个可能出错的语句后需要添加代码的(sql 2005 可以直接用try ... catch)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值