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

来源:互联网 发布:深圳市网络预约出租车 编辑:程序博客网 时间:2024/05/10 04:08
问题有点复杂。
假如我有叁个存储过程,每个存储过程中都显示申明了事物,当我依次调用这叁个存储过程,如果其中有一个存储过程中发生了错误,那么其它两个存储过程中的事物都要回滚,这样的如何做呢?
下面我把代码贴出来让大家看看。
SQL code
----------------第一个存储过程-----------------CREATE PROCEDURE TransProc_1 @PriKey INT, @CharCol CHAR(3),@error_out int output ASBEGIN TRANSACTION InProc_1 INSERT INTO TestTrans VALUES (@PriKey, @CharCol) INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol) set @error_out=@@errorCOMMIT TRANSACTION InProc_1;GO--------------第二个存储过程-------------------CREATE PROCEDURE TransProc_2 @PriKey INT, @CharCol CHAR(3), @error_out int output ASBEGIN TRANSACTION InProc INSERT INTO TestTrans VALUES (@PriKey, @CharCol) INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol) set @error_out=@@errorCOMMIT TRANSACTION InProc;GO--------------第叁个存储过程-------------------CREATE PROCEDURE TransProc_3 @PriKey INT, @CharCol CHAR(3), @error_out int output ASBEGIN TRANSACTION InProc INSERT INTO TestTrans VALUES (@PriKey, @CharCol) INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol) set @error_out=@@errorCOMMIT TRANSACTION InProc;GO---------------------------------BEGIN TRANSACTION OutOfProc;DECLARE @ERROR INT;--依次调用这些存储过程EXEC TransProc_1 10, 'aaa',@error_out=@ERROR outputEXEC TransProc_2 20, 'ccc',@error_out=@ERROR outputEXEC 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;ENDGO


上面的代码运行肯定是不行的,不能达到我想要的效果,请问有什么方法可以解决我现在的问题呢?
============================================================================
问题答案:
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)
原创粉丝点击