存储过程嵌套事务处理

-- SQLServer 存储过程嵌套事务处理
/***
某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形。
 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否可能被其他存储过程调用的情况下,
 建议每个存储过程都按照这个模板建立create proc proc_exam,
 当然调用存储过程的地方,需要判断存储过程的返回值来做相应的处理
***/
CREATE proc proc_example
as 
begin 
    --声明变量,存放当前已开启的事务数
    declare @exist_trancount int
    select @exist_trancount = @@trancount

    /** 1 首先判断当前存储过程实例执行是否是嵌套事务调用。如果是嵌套,则存储过程判断的@@TRANCOUNT应该大于,
        此时创建一个事务保存点,而非开启新事务;如果不是嵌套事务,则@@TRANCOUNT应该为,此时开启新事务即可*/
    if @exist_trancount > 0
        --创建事务保存点
        save transaction tran_proc
    else
        --开启新事务
        begin transaction tran_proc
        
        /*
          2 然后,是存储过程本身的业务处理代码,每一步处理代码需要判断@@ERROR,如果<>0,执行error代码
            存储过程业务处理代码
            ·········
        */
        
        
        
        if @@error<>0
            goto error

    
    /* 3 最后,如果处理正确执行,并且非嵌套调用,则提交事务;如果发生错误,则回滚事务或者回滚保存点。*/
        if @exist_trancount = 0
            --提交事务
            commit tran tran_proc
            return 1
        error:
            --回滚事务或者事务保存点
            rollback transaction tran_proc
            return -1
end

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值