【问题标题】:SQL Server: Does 'DROP TABLE' inside transaction causes an implicit commit?SQL Server:事务内的“DROP TABLE”是否会导致隐式提交?
【发布时间】:2014-07-18 14:12:11
【问题描述】:

我的问题有点简单,但在创建此交易后我仍然怀疑。如果我执行以下代码:

BEGIN TRANSACTION
      DROP TABLE Table_Name

我可以执行 ROLLBACK TRANSACTION 来恢复删除的表吗?我之所以问,是因为我不知道“对象资源管理器”中发生了什么,而且我没有发现任何关于这个主题的问题,所以我认为这可能是一个有用的问题。

【问题讨论】:

  • 你为什么不试试呢?提示:是的,它会起作用,但你已经完成了 99.9% 的测试。试试看吧。
  • 我认为你是对的,但我找不到这个话题的任何答案,它会对任何面临这个问题的人有所帮助。我需要删除一些表,我认为这会导致隐式提交,因为我在第一次 DROP 之后所做的 ROLLBACK 不会返回表......所以这就是我问的原因!
  • 当涉及到这种类型的事情时,不要认为它可能会起作用。测试一下,看看你是否不确定。任何 DBMS 在此处的行为都相同。这是 ACID 主体的一部分。任何地方都没有隐式提交。如果你开始一个事务,没有什么会导致隐式提交。
  • 好的,肖恩,非常感谢您的帮助。无论如何,我还有一个疑问......为什么我在同一个选项卡内回滚操作后无法执行 SELECT 语句?是一种奇怪的行为,因为我在说“嘿,你,把我的桌子还给我!”
  • 你可以。请参阅我发布的答案中的示例。

标签: sql transactions drop-table


【解决方案1】:

这非常容易测试。

create table TransactionTest
(
    ID int identity primary key clustered,
    SomeValue varchar(20)
)

insert TransactionTest
select 'Here is a row'

begin transaction
    drop table TransactionTest
rollback transaction

select * from TransactionTest

【讨论】:

  • 你说得对,非常感谢!我发誓我第一次做不到 SELECT,但是执行这个测试它是有效的。再次感谢您的宝贵时间!
  • Truncate也是一样,可以回滚。
【解决方案2】:

DROP TABLE 可以回滚,但不会自动提交。

【讨论】:

  • 那么,为什么你不能这样做呢? BEGIN TRANSACTION DROP TABLE TABLENAME ROLLBACK SELECT * FROM TABLENAME ...如果我回滚操作,为什么我不能在选项卡内执行选择语句?感谢您的回答! =)
  • 对于其他阅读的人,您不能在所有 RDBM 中,但可以在作为 OP 数据库选择的 SQL Server 中。例如 MySQL:dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
【解决方案3】:

我只想补充一点,我在 Oracle 11g、Mysql 5.7 和 MSSQL 2016 中尝试过。它只回滚(工作)与 MSSQL RDBMS。我希望大多数其他 RDBMS 不会支持它,因为它会执行架构更改。

ORACLE PL/SQL EX:

savepoint mysave;
DROP TABLE test_table;
ROLLBACK TO mysave;
select * from test_table;

【讨论】:

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