【问题标题】:SQL Server : Rollback without BEGIN TRANSACTIONSQL Server:没有BEGIN TRANSACTION的回滚
【发布时间】:2013-01-23 05:02:54
【问题描述】:

有没有一种方法可以在不使用BEGIN TRANSACTION 的情况下使用 ROLLBACK 回滚到事务的先前状态?

delete from table1;
ROLLBACK

消息:

ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

任何意见都会有很大帮助。

谢谢!!!

【问题讨论】:

  • 一切都有规律。还没上车,你想怎么下车?

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

要在明确设置 IMPLICIT_TRANSACTIONS ON 时扩展 gerrytans 答案,可以使用 ROLLBACK。请参阅与此相关的MSDN doco。请注意,这不是默认的autocommit transaction mode

这让我可以运行类似的语句;

SET IMPLICIT_TRANSACTIONS ON

INSERT INTO my_table (item_type, start_date_time)
VALUES ('TEST', CURRENT_TIMESTAMP)

ROLLBACK

-- Shouldn't return the 'TEST' value inserted above.
SELECT * FROM my_table ORDER BY start_date_time DESC 

【讨论】:

    【解决方案2】:

    正如 SQL 服务器错误告诉你的那样——不,你不能。很多人会很好奇,你为什么首先想要这个。

    请记住,SQL Server 有一个隐式事务——即对于您在没有显式 BEGIN TRAN 的情况下发出的 DML,SQL Server 将在屏幕后面为您启动和完成一个事务。

    ROLLBACK 的一个常见用途是用于错误处理。如果在事务的中间某处您意识到由于用户输入错误或其他原因无法继续进行 - 那么合理的操作是 ROLLBACK 以返回起点

    可能发生的最糟糕的事情是让您的数据状态“处于中间位置”。

    【讨论】:

      【解决方案3】:

      您必须先拥有BEGIN TRANSACTION,然后才能使用ROLLBACK 命令。你不能回到以前的状态。

      【讨论】:

      • 是的,但是 sql server 是否支持任何形式的回滚而不需要 BEGIN TRANSACTION 。
      • 您能否提供示例或链接来说明 Oracle 如何支持这一点?
      • 我认为 Oracle 默认使用事务。 SQL Server 默认是没有事务。您必须明确定义事务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多