【问题标题】:If it is not allowed to rollback a TRUNCATE statement then how is it possible to use it in a transaction? [duplicate]如果不允许回滚 TRUNCATE 语句,那么如何在事务中使用它? [复制]
【发布时间】:2011-12-17 06:08:48
【问题描述】:

可能重复:
Truncate Table Within Transaction

如果不允许回滚 TRUNCATE 语句,那么它如何在事务中回滚?考虑以下代码:

USE tempdb
GO
-- Create Test Table
CREATE TABLE TruncateTest (ID INT)
INSERT INTO TruncateTest (ID)
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
GO
-- Check the data before truncate
SELECT * FROM TruncateTest
GO
-- Begin Transaction
BEGIN TRAN
-- Truncate Table
TRUNCATE TABLE TruncateTest
GO
-- Check the data after truncate
SELECT * FROM TruncateTest
GO
-- Rollback Transaction
ROLLBACK TRAN
GO
-- Check the data after Rollback
SELECT * FROM TruncateTest
GO
-- Clean up
DROP TABLE TruncateTest
GO

【问题讨论】:

  • 你到底在问什么?在 SQL Server 中,TRUNCATE 是事务性的。你在哪里读到它不是?
  • 你有一堆问题已经得到解答,显然对你有帮助,但你还没有accepted them。请做其他人可能不愿意帮助你
  • 曾几何时,该问题被标记为oracle 标记以及sql-server 标记。提问几天后,oracle 标签被删除。

标签: sql sql-server


【解决方案1】:

Truncate Cannot Be Rolled Back Because It Is Not Logged 是一个相当普遍的 SQL Server 信念。但是,您问题中的代码只是验证这实际上是一个神话。

TRUNCATE 确实比DELETE 需要更多更少 日志记录,因为它只将页面释放和一些元数据更新记录到系统表中,而不是将已删除行的全部内容记录到日志中( See a detailed breakdown of logging here)。

SQL Server continues to lock 释放页面,直到事务提交阻止重新分配它们,因此TRUNCATE 中的ROLLBACK 只需要反转这些记录在日志中的页面释放和系统表更新。

【讨论】:

    【解决方案2】:

    MS SQL:

    Truncate 语句不能回滚的概念很容易被误解。

    当您执行 Truncate 语句时,它不会记录在日志文件中,因为它是 DDL 语句。

    所以如果你截断一个表,你不能回滚到截断之前的时间点。

    但是,在事务中,回滚是允许的,并且功能与任何其他回滚一样。

    所指的回滚不是事务回滚。

    本质上:在发出 COMMIT 之前的任何地方,您都可以回滚 TRUNCATE 语句。在 COMMIT 之后,即使使用日志文件也无法回滚数据。无法恢复。

    【讨论】:

    • 当这个问题被问到 Oracle 和 SQL Server 时,你应该添加一个注释,你的答案只是在谈论 SQL Server(在 Oracle 中你不能回滚 TRUNCATE)
    【解决方案3】:

    在 Oracle 中,TRUNCATE 语句会在当前事务执行之前终止它(我相信使用 COMMIT)。然后,因为它被视为 DDL 语句,所以 TRUNCATE 执行而没有回滚的可能性。然后开始一个新的事务。

    据我了解,Oracle 中其他 DDL 语句的行为有些相似。

    一些 DBMS 提供事务性 DDL 语句 - 它也非常有用。

    【讨论】:

    • 谢谢,能给我官方链接吗?
    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2016-03-05
    相关资源
    最近更新 更多