如果嵌套事务已成功提交,父事务是否有可能失败

时间:2018-07-07 15:06:47

标签: sql sql-server tsql transactions nested-transactions

我试图了解SQL Server中的嵌套事务。让我们考虑以下SQL命令链:

BEGIN TRANSACTION; -- #1
BEGIN TRANSACTION; -- #2
UPDATE foo SET column = 'something'; -- Change something in one table.
COMMIT TRANSACTION; -- #2

如果事务#2的提交成功,事务#1的提交是否可能失败?如果是,您可以举一个例子说明何时会发生这种情况吗?

1 个答案:

答案 0 :(得分:6)

来自A SQL Server DBA myth a day: (26/30) nested transactions are real

  

提交嵌套事务绝对没有任何作用-因为就SQL Server而言,真正存在的唯一事务是外部事务。 ...

     

嵌套事务的回滚将回滚整个事务集-因为没有嵌套事务之类的东西。

SELECT @@TRANCOUNT;
BEGIN TRANSACTION; -- #1
SELECT @@TRANCOUNT;
BEGIN TRANSACTION; -- #2
SELECT @@TRANCOUNT;
UPDATE foo SET [column] = 'something';
COMMIT TRANSACTION; -- #2
SELECT @@TRANCOUNT;
ROLLBACK;      -- simulate error or explicit rollback
               -- update is lost

DBFiddle Demo

如果您想要类似Oracle自主交易的内容,请阅读:Commit transaction outside the current transaction (like autonomous transaction in Oracle)