2012-08-01 71 views
10

嗨,我目前对TSQL中嵌套事务的理解是,如果你有多个事务(多个事务嵌套在一个“外部”事务中),所有的事务都必须提交(使用“外部”事务是最后一个)对数据库进行的任何更改。如果提交的数量少于未完成交易的数量,则不做与任何交易相关的更改。这是嵌套事务处理的正确概述吗?TSQL中的嵌套事务

回答

12

您对COMMIT的描述是正确的。

Kalen Delaney has an article covering the same type of behavior that you describe.

然而,如在卡伦的文章中讨论,嵌套事务内的ROLLBACK将其中发生回滚回滚整个外交易,不只是内部事务。

注意以下结果:

BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 

ROLLBACK TRAN 
SELECT @@trancount 

这MSDN文章中所描述的,Nesting Transactions

的ROLLBACK WORK或ROLLBACK TRANSACTION语句不具有 事务名回滚所有嵌套事务并将 @@ TRANCOUNT减少为0.使用事务的ROLLBACK事务 一组嵌套事务中最外层事务的名称 将回滚所有嵌套事务并将@@ TRANCOUNT 减少为0.如果您不确定是否已处于事务中,请选择 @@ TRANCOUNT以确定它是否为1或更多。如果@@ TRANCOUNT为0,那么您的 不在事务中。

3

总之,你的回答是肯定的。从Nesting Transactions

提交内部事务被SQL Server数据库 引擎忽略。该交易根据 在最外层交易结束时采取的行动提交或回滚。如果提交外部事务 ,则内部嵌套事务也提交 。如果外部交易回滚,则所有内部交易也会回滚,而不管内部交易是否单独提交。

关于ROLLBACks,只允许ROLLBACK整个外部事务。