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

本文探讨了在SQL中如何正确地使用事务来确保多个存储过程的一致性。当任何一个存储过程发生错误时,通过外部事务统一进行回滚操作,确保数据的完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题有点复杂。
假如我有叁个存储过程,每个存储过程中都显示申明了事物,当我依次调用这叁个存储过程,如果其中有一个存储过程中发生了错误,那么其它两个存储过程中的事物都要回滚,这样的如何做呢?
下面我把代码贴出来让大家看看。
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、付费专栏及课程。

余额充值