SQL Server:事务内的“DROP TABLE”是不是会导致隐式提交?

Posted

技术标签:

【中文标题】SQL Server:事务内的“DROP TABLE”是不是会导致隐式提交?【英文标题】: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 语句?是一种奇怪的行为,因为我在说“嘿,你,把我的桌子还给我!” 你可以。请参阅我发布的答案中的示例。 【参考方案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;

【讨论】:

以上是关于SQL Server:事务内的“DROP TABLE”是不是会导致隐式提交?的主要内容,如果未能解决你的问题,请参考以下文章

《SQL Server 2008从入门到精通》--20180716

事务处理器内的C#,SQL SP通过超时结束事务

如何在 SQL 中针对事务表计算一段时间内的覆盖日期?

sql server中的事务是啥意思

sql server 2012 事务日志在哪

sql server运行中,是不是能删除主数据库事务日志文件