技术开发 频道

SQL Server嵌套事务


【IT168技术文档】

  先看一下SQL Server Online Help相关的说明

  1. Begin Transaction:标记一个显式本地事务的起始点。BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。
  2. Rollback Transaction: 将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。(嵌套事务时,该语句将所有内层事务回滚到最外面的 BEGIN TRANSACTION 语句。无论在哪种情况下,ROLLBACK TRANSACTION 都将 @@TRANCOUNT 系统函数减小为 0。ROLLBACK TRANSACTION savepoint_name 不减小 @@TRANCOUNT。)
  3. Commit Transaction: 标志一个成功的隐性事务或显式事务的结束。如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放事务所占用的资源,并将 @@TRANCOUNT 减少到 0。如果 @@TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减并且事务将保持活动状态。

  下面用代码进行解释,代码是根据Online Help Commit Transaction一节的代码修改而成,首先建立一个Table,然后开始三个Trasaction,中间人为触发一些错误,然后观察运行结果。
1--Bad code 2USE NORTHWIND; 3--Create test table 4IF Object_id(N'TestTran',N'U') IS NOT NULL 5 DROP TABLE TESTTRAN; 6 7CREATE TABLE TESTTRAN ( 8 COLA INT PRIMARY KEY, 9 COLB CHAR(3)); 10 11--Variable for keeping @@ERROR 12DECLARE @_Error INT; 13SET @_Error = 0; 14 15--Begin 3 nested transaction 16BEGIN TRANSACTION OUTERTRAN; 17BEGIN TRANSACTION INNER1; 18BEGIN TRANSACTION INNER2; 19 20INSERT INTO TESTTRAN VALUES (3,'ccc');--Inner2 21 22RAISERROR('Inner2 error', 16, 1) 23IF @@ERROR = 0 24 COMMIT TRANSACTION INNER2; 25ELSE 26 ROLLBACK TRANSACTION ; 27 28INSERT INTO TESTTRAN VALUES (2,'bbb');--Inner1 29 30IF @@ERROR = 0 31 COMMIT TRANSACTION INNER1; 32ELSE 33 ROLLBACK TRANSACTION ; 34 35INSERT INTO TESTTRAN VALUES (1,'aaa');--OuterTran 36 37--RAISERROR ('OuterTran error',16,1) 38 39IF @@ERROR = 0 40 COMMIT TRANSACTION OuterTran; 41ELSE 42 ROLLBACK TRANSACTION; 43 44SELECT * FROM TESTTRAN (NOLOCK); 45SELECT @@Trancount;
0
相关文章