- 1.计数方法
- 事务计数器从0开始,没嵌套一个事务,事务计数器+1,COMMIT一个事务计数器-1.
注意:事务保存点属于事务内部,不会对事务计数器产生影响。下面的示例演示嵌套的 BEGIN 和 COMMIT 语句对 @@TRANCOUNT 变量产生的效果。
PRINT @@TRANCOUNT -- The BEGIN TRAN statement will increment the -- transaction count by 1. BEGIN TRAN PRINT @@TRANCOUNT BEGIN TRAN PRINT @@TRANCOUNT -- The COMMIT statement will decrement the transaction count by 1. COMMIT PRINT @@TRANCOUNT COMMIT PRINT @@TRANCOUNT --Results --0 --1 --2 --1 --0
- 2. 事务回滚对事务计数器的影响
- 当子事务ROLLBACK之后,会直接清零TRANCOUNT,下面的示例演示嵌套的 BEGIN TRAN 和 ROLLBACK 语句对 @@TRANCOUNT 变量产生的效果。
PRINT @@TRANCOUNT -- The BEGIN TRAN statement will increment the -- transaction count by 1. BEGIN TRAN PRINT @@TRANCOUNT BEGIN TRAN PRINT @@TRANCOUNT -- The ROLLBACK statement will clear the @@TRANCOUNT variable -- to 0 because all active transactions will be rolled back. ROLLBACK PRINT @@TRANCOUNT --Results --0 --1 --2 --0
- 3.使用保存点确保事务嵌套时父事务能正确回滚
-
begin transaction trn_example update tableName set fieldName = @value save transaction stk_savePoint update tableName2 set fieldName2 = @value2 if @@error<>0 begin rollback transaction stk_savePoint commit transaction return end else begin if @@rowcount = 0 rollback transaction end commit transaction --如果第二个update出现错误,就返回到第一个update后提交,并且使用return截断后面的语句继续运行 --如果第二个update正确执行,就是更新的行数是0,就回滚整个事务,把第一个update执行的结果也取消
使用保存点确保事务嵌套时能正确回滚是比较好的方法,还有一种方法是在子过程里面判断是否是子事务(@@rowcount>1),如果是并且需要回滚,则返回一个值给父事务,由父事务判断并回滚。