TSQL中的嵌套事务

Llo*_*nks 11 t-sql sql-server

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

Mic*_*son 13

你的描述COMMIT是正确的.

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

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

请注意以下结果:

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

ROLLBACK TRAN
SELECT @@trancount
Run Code Online (Sandbox Code Playgroud)

这在MSDN文章嵌套事务中描述:

没有事务名称的ROLLBACK WORK或ROLLBACK TRANSACTION语句回滚所有嵌套事务并将@@ TRANCOUNT减少为0.使用一组嵌套事务中最外层事务的事务名称的ROLLBACK TRANSACTION回滚所有嵌套的事务并将@@ TRANCOUNT递减到0.当您不确定是否已经在事务中时,请选择@@ TRANCOUNT以确定它是否为1或更多.如果@@ TRANCOUNT为0,则表示您不在交易中.


Jam*_*See 6

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

SQL Server 数据库引擎会忽略提交内部事务。根据在最外层事务结束时采取的操作,提交或回滚事务。如果提交了外部事务,则也提交了内部嵌套事务。如果回滚外部事务,则所有内部事务也将回滚,无论内部事务是否单独提交。

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