【问题标题】:SQL Transaction self-committingSQL 事务自提交
【发布时间】:2014-11-25 09:25:54
【问题描述】:

我在事务中运行以下 SQL 更新查询,以便在提交之前检查结果。然而,在执行和回滚之后,我发现它已经提交并且我的数据发生了变化,尽管从未发出过提交语句。

USE WS_Live
BEGIN TRAN Test

UPDATE AF
SET AF.AdditionalFieldsLookup11 = NULL

OUTPUT inserted.*

FROM dbo.Incident AS I

INNER JOIN dbo.AdditionalFields AS AF
ON AF.Oid = I.AdditionalFields

INNER JOIN dbo.AdditionalFieldsLookup11 AS AFL11
ON AFL11.Oid = AF.AdditionalFieldsLookup11

WHERE AF.AdditionalFieldsLookup11 IS NOT NULL

我的声明格式正确,我没有丢失任何重要数据,但我想知道为什么会发生这种情况,以免将来遇到问题。

【问题讨论】:

    标签: sql tsql transactions commit


    【解决方案1】:

    默认情况下,自动提交模式设置为 true 的 SQL Server 角色。

    Here 是如何关闭它,这里有一些关于这个功能的额外细节:

    【讨论】:

    • 我已经完成了其他可以回滚的事务。为什么有些会起作用而有些不起作用?
    • 从您的第一个链接看来,我的 BEGIN 应该覆盖自动提交。 A SQL Server connection operates in autocommit mode until a BEGIN TRANSACTION statement starts an explicit transaction, or implicit transaction mode is set on.
    • 哦等等...我知道我做了什么。我没有将ROLLBACK TRAN Test 放在我的SQL 查询的末尾,而是将BEGIN 替换为ROLLBACK,所以它有效地回滚了我之前的事务,就好像我附加了命令一样,然后在执行完之后继续执行整个查询ROLLBACK 线。
    【解决方案2】:

    事实证明,当我尝试回滚原始事务时,SQL 所做的正是我告诉它的事情。我没有将ROLLBACK 附加到我的事务末尾,而是将BEGIN TRAN Test 修改为ROLLBACK TRAN Test,如下所示:

    USE WS_Live
    ROLLBACK TRAN Test
    
    UPDATE AF
    SET AF.AdditionalFieldsLookup11 = NULL
    
    OUTPUT inserted.*
    
    FROM dbo.Incident AS I
    
    INNER JOIN dbo.AdditionalFields AS AF
    ON AF.Oid = I.AdditionalFields
    
    INNER JOIN dbo.AdditionalFieldsLookup11 AS AFL11
    ON AFL11.Oid = AF.AdditionalFieldsLookup11
    
    WHERE AF.AdditionalFieldsLookup11 IS NOT NULL
    

    SQL 的行为就像我已将 ROLLBACK TRAN Test 附加到上一个查询的末尾,然后在其末尾附加了一个附加查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多