14

嗨,我目前对 TSQL 中嵌套事务的理解是,如果您有多个事务(多个事务嵌套在一个“外部”事务中),则必须提交所有事务(“外部”事务是最后一个)要对数据库进行更改。如果提交的数量少于打开的事务的数量,则不会进行与任何事务相关的更改。这是对嵌套事务如何工作的正确概述吗?

4

2 回答 2

17

你的描述COMMIT是正确的。

Kalen Delaney 有一篇文章涵盖了您描述的相同类型的行为。

然而,正如 Kalen 的文章中所讨论的,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 TRANSACTION 回滚所有嵌套事务并将 @@TRANCOUNT 减为 0。当您不确定是否已经在事务中时,请选择 @@TRANCOUNT 以确定它是否为 1 或更多。如果@@TRANCOUNT 为0,则您不在事务中。

于 2012-08-01T18:03:10.583 回答
8

简而言之,你的答案是肯定的。从嵌套事务

SQL Server 数据库引擎会忽略提交内部事务。基于在最外层事务结束时采取的操作,事务要么被提交,要么被回滚。如果提交了外部事务,则也提交了内部嵌套事务。如果外部事务被回滚,那么所有内部事务也会被回滚,而不管内部事务是否被单独提交。

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

于 2012-08-01T18:05:37.290 回答