sql 关于dblink和多条update、insert事务回滚写法

本文详细介绍了在SQL存储过程中如何使用事务(TRAN)确保数据一致性,特别是在调用多个存储过程和跨库操作时。通过TRY...CATCH结构和RAISERROR函数实现了更规范的错误处理流程。

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

在存储过程的编写中难免会遇到调用同库他人的proc和跨库调用proc,还有一个proc中有多条对多表进行写入和修改的语句。那么就会用到tran。

如果我们在不写try的情况下就要对每个insert,update的后面写上

IF @@error <> 0
                OR @@Rowcount = 0
                BEGIN
                    ROLLBACK TRAN 
                END    

来确保所有语句的正常执行和有影响的行数。

 

而在写了try的情况下,我们就可规范一下写法,利用RAISERROR

DECLARE @Ret_Msg VARCHAR(200)
DECLARE @Ret_Msg1 VARCHAR(200)
DECLARE @nResult INT
DECLARE @vcResult VARCHAR(200)
BEGIN TRY
        BEGIN TRAN
               UPDATE Table_a set a=1 WHERE b =1
               IF @@Rowcount = 0
               BEGIN
                    SET @Ret_Msg = '执行失败'
                    SET @Ret_Msg1 = 'Table_a 更新失败'
                    RAISERROR(@Ret_Msg1,16,1)
               END
               数据库.架构.proc 1,2, @nResult OUT, @vcResult OUT
               IF @nResult <0
               BEGIN
                    SET @Ret_Msg = @vcResult
                    SET @Ret_Msg1 = 'dbLink调用失败' + @vcResult
                    RAISERROR(@Ret_Msg1,16,1)
               END
               SELECT @Ret_Msg  as vcResult 
        COMMIT TRAN
END TRY
BEGIN CATCH
    IF @@tranCount > 0
                ROLLBACK TRAN;
    SELECT  @Ret_Msg AS vcResult 
END CATCH             

当结果不是我们想要的就RAISERROR抛个错误,让CATCH处理

转载于:https://www.cnblogs.com/ghelement/p/5387375.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值