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”是不是会导致隐式提交?的主要内容,如果未能解决你的问题,请参考以下文章