我目前对TSQL中嵌套事务的理解是,如果你有多个事务(嵌套在一个“外部”事务中的几个事务),所有的事务都必须提交(“外部”事务是最后一个事务)要对数据库进行更改。如果提交的数量少于打开的事务数,则不会进行与任何事务相关的更改。这是嵌套事务如何工作的正确概述吗?
我目前对TSQL中嵌套事务的理解是,如果你有多个事务(嵌套在一个“外部”事务中的几个事务),所有的事务都必须提交(“外部”事务是最后一个事务)要对数据库进行更改。如果提交的数量少于打开的事务数,则不会进行与任何事务相关的更改。这是嵌套事务如何工作的正确概述吗?
你的描述 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,那么你 不在交易中。
简而言之,你的答案是肯定的。从 嵌套交易:
SQL Server数据库忽略了提交内部事务 发动机。事务是基于提交或回滚的 在最外层交易结束时采取的行动。如果外面 事务已提交,内部嵌套事务也是如此 承诺。如果外部事务被回滚,那么所有内部事务 交易也会回滚,无论是否 内部交易是单独承诺的。
关于ROLLBACks,只允许ROLLBACK整个外部事务。