【问题标题】:Is it possible for parent transaction to fail if nested transaction was successfully committed如果嵌套事务成功提交,父事务是否可能失败
【发布时间】:2018-07-07 15:06:47
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

来自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)

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2016-07-08
    • 1970-01-01
    • 2013-01-09
    • 2020-06-23
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多