版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、语法
-
--创建事务
-
BEGIN TRAN
-
--事务标签
-
SAVE TRAN [TranName]
-
--提交事务
-
COMMIT TRAN
-
--回滚事务
-
ROLLBACK TRAN
-
--事务计数
-
DECLARE @sTranCount
INT
-
SET @sTranCount=@@TRANCOUNT
二、常见用法
1、单事务
-
--事务计数
-
DECLARE @sTranCount
INT
-
SET @sTranCount=@@TRANCOUNT
--此时为 0
-
--监测异常
-
BEGIN TRY
-
--创建事务
-
BEGIN TRAN
--此时 @@TRANCOUNT为 1
-
/*此处实现业务处理-下*/
-
SELECT
1
-
/*
-
--主动抛出异常
-
RAISERROR('抛出异常说明',16,1)
-
--主动回滚
-
ROLLBACK TRAN
-
*/
-
/*此处实现业务处理-上*/
-
--提交事务
-
COMMIT TRAN
--此时 @@TRANCOUNT为 0
-
END TRY
-
BEGIN CATCH
-
--存在事务则回滚
-
IF @@TRANCOUNT > @sTRANCOUNT
-
BEGIN
-
--回滚事务
-
ROLLBACK TRAN
--此时 @@TRANCOUNT为 0
-
END
-
END CATCH
2.嵌套事物-不存在SAVE TRAN
-
--事务计数
-
DECLARE @sTranCount
INT
-
SET @sTranCount=@@TRANCOUNT
--此时为 0
-
--监测异常
-
BEGIN TRY
-
--创建事务
-
BEGIN TRAN Tran1
--此时 @@TRANCOUNT为 1
-
--创建事务
-
BEGIN TRAN Tran2
--此时 @@TRANCOUNT为 2
-
--提交事务
-
COMMIT TRAN Tran2
--此时 @@TRANCOUNT为 1
-
--提交事务
-
COMMIT TRAN Tran1
--此时 @@TRANCOUNT为 0
-
END TRY
-
BEGIN CATCH
-
--存在事务则回滚
-
IF @@TRANCOUNT > @sTRANCOUNT
-
BEGIN
-
--回滚事务
-
ROLLBACK TRAN
--此时 @@TRANCOUNT为 0
-
END
-
SELECT
1
-
END CATCH
-
-
/*****注意******
-
1.ROLLBACK TRAN 事务回滚,会将事务全部回滚(不存在 SAVE TRAN),即回滚后@@TRANCOUNT=0
-
2.只有最外层的COMMIT TRAN 提交,数据库才会永久更改
-
****************/
3.嵌套事务-存在SAVE TRAN
-
--事务计数
-
DECLARE @sTranCount
INT
-
SET @sTranCount=@@TRANCOUNT
--此时为 0
-
--监测异常
-
BEGIN TRY
-
--创建事务
-
BEGIN TRAN
--此时 @@TRANCOUNT为 1
-
--创建事务
-
SAVE TRAN SaveTran1
--此时 @@TRANCOUNT为 2
-
--回滚到上次保存点
-
ROLLBACK TRAN SaveTran1
--此时 @@TRANCOUNT为 2
-
SELECT
1
-
--提交事务
-
COMMIT TRAN
--此时 @@TRANCOUNT为 0
-
END TRY
-
BEGIN CATCH
-
--存在事务则回滚
-
IF @@TRANCOUNT > @sTRANCOUNT
-
BEGIN
-
--回滚事务
-
ROLLBACK TRAN
--此时 @@TRANCOUNT为 0
-
END
-
SELECT
1
-
END CATCH
-
-
/*****注意******
-
1.ROLLBACK TRAN [保存点] 事务回滚,会将事务回滚到上一次保存点,但回滚后@@TRANCOUNT依旧不变
-
2.只有最外层的COMMIT TRAN 提交,数据库才会永久更改
-
****************/