存储过程中实现事务并添加异常捕获

-- 存储过程:异常获取、事务
ALTER PROCEDURE [PROC]
        @PARAM NVARCHAR(100) = N''
AS
BEGIN
    SET NOCOUNT ON;
    --开启产生运行时错误,整个事务将终止并回滚,默认OFF(随机,可能继续执行,也可能终止执行)
    SET XACT_ABORT ON; 
    
    --TRY_CATCH
    BEGIN TRY
        --添加事务,保证下面的行级锁保持到事务的结束(ROWLOCK、XLOCK必须放在事务中)
        BEGIN TRANSACTION;
        --增、删、改。对数据库的操作在事务中。
        --锁会在事务结束后释放。不管是回退还是提交。都会释放。
        --变动前锁定指定数据。
        --排他锁,行级锁,指明数据库引擎返回结果时忽略加锁的行或数据页
        --READPAST :不会返回锁定的记录。这个语句的缺点是,其他操作不返回锁定的记录,只到事务释放才会释放锁。       

        SELECT *                    
        FROM TABLE
        WITH(XLOCK,ROWLOCK,READPAST) 
        WHERE ISDEL = 0
        AND CID = @CID;

        --锁定后变更
        UPDATE DBO.TAB
        SET ISDEL = 1
        WHERE ID = @PARAM;

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        --如果发生异常,且存在事务,则回滚。
        ROLLBACK TRANSACTION;
        --抛出异常
        DECLARE @ErrorMessage NVARCHAR(4000);
		DECLARE @ErrorSeverity INT;
		DECLARE @ErrorState INT;
		SELECT 
			@ErrorMessage = ERROR_MESSAGE(),
			@ErrorSeverity = ERROR_SEVERITY(),
			@ErrorState = ERROR_STATE();
			
		RAISERROR (@ErrorMessage,  -- Message text.
				   @ErrorSeverity, -- Severity.
				   @ErrorState     -- State.
				   );
    END CATCH

    SET XACT_ABORT OFF;
	SET NOCOUNT OFF;
END

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pezynd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值