问题有点复杂。
假如我有叁个存储过程,每个存储过程中都显示申明了事物,当我依次调用这叁个存储过程,如果其中有一个存储过程中发生了错误,那么其它两个存储过程中的事物都要回滚,这样的如何做呢?
下面我把代码贴出来让大家看看。
假如我有叁个存储过程,每个存储过程中都显示申明了事物,当我依次调用这叁个存储过程,如果其中有一个存储过程中发生了错误,那么其它两个存储过程中的事物都要回滚,这样的如何做呢?
下面我把代码贴出来让大家看看。
-
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;
ENDGO
至于错误处理, 那是你在每个可能出错的语句后需要添加代码的(sql 2005 可以直接用try ... catch)