问题 TSQL中的嵌套事务


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


6769
2017-08-01 17:53


起源



答案:


你的描述 COMMIT 是正确的。

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

但是,正如Kalen的文章中所讨论的那样 ROLLBACK 在嵌套事务中,将回滚整个外部事务,而不仅仅是发生回滚的内部事务。

请注意以下结果:

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

ROLLBACK TRAN
SELECT @@trancount

这在MSDN文章中描述, 嵌套交易

ROLLBACK WORK或ROLLBACK TRANSACTION语句没有   事务名称回滚所有嵌套的事务和减量   @@ TRANCOUNT为0.使用该事务的ROLLBACK TRANSACTION   一组嵌套事务中最外层事务的名称   回滚所有嵌套事务并递减@@ TRANCOUNT   当你不确定你是否已经在交易中时,选择SELECT   @@ TRANCOUNT确定它是否为1或更多。如果@@ TRANCOUNT为0,那么你   不在交易中。


12
2017-08-01 18:03





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

SQL Server数据库忽略了提交内部事务   发动机。事务是基于提交或回滚的   在最外层交易结束时采取的行动。如果外面   事务已提交,内部嵌套事务也是如此   承诺。如果外部事务被回滚,那么所有内部事务   交易也会回滚,无论是否   内部交易是单独承诺的。

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


3
2017-08-01 18:05