-- 存储过程:异常获取、事务
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