【问题标题】:We can rollback without saying "Rollback"?我们可以不说“回滚”就回滚吗?
【发布时间】:2012-05-07 21:33:32
【问题描述】:

我在 SQL Server 2005 中执行此操作。 我有一张表,只有一列 int 类型,不能在其中插入 char。

如果我运行这个,我会在我的表中插入一行。

INSERT INTO TestTable VALUES(3)   --success 
INSERT INTO TestTable VALUES('b') --fail, cannot insert char

如果我运行它,我将在我的表中插入零行。因此,事务将 2 个任务组合成一个执行单元。如果一项任务失败,则整个事务都会失败。

BEGIN TRANSACTION 
INSERT INTO TestTable VALUES(3)
INSERT INTO TestTable VALUES('b')
COMMIT TRANSACTION

我的问题是:ROLLBACK TRANSACTION 似乎没用,因为我在上面的代码中没有 ROLLBACK 但它仍然被回滚....有人可以帮助我理解这一点吗?

【问题讨论】:

  • 如果您的语句有 none 失败,但您仍想撤销更改,ROLLBACK 非常有用。 :)
  • 这就是你的全部代码吗? (或至少所有相关代码)
  • @MilkyWayJoe:是的,这就是我的全部代码。仅供学习。

标签: sql-server sql-server-2005 transactions


【解决方案1】:

在 SQL Server 中,默认情况下所有代码都在隐式事务中运行。如果您在一批中提交两个语句并且您启用了查询选项 XACT_ABORT,那么任何失败都应该回滚整个事务。默认行为是仅回滚导致错误的语句。如果您分批提交语句(通过在 SSMS 中单独突出显示它们并按 F5 或在其间放置“go”语句),我认为您会看到不同的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多