一、為什么數據庫DDL不支持事務回滾
一般數據庫的實現,以Oracle為例,在執行DDL后會隱式提交。所以你看上去好像DDL不會回滾。其實你可以做個實驗,在同一個事務里執行幾條DML,再執行DDL,再回滾。你會發現DDL之前執行的DML也不會回滾,因為數據庫已經幫你提交了。
當然你會問為什么這么實現,這是因為內存空間有限,DDL是修改數據字典,而且通常不會有長時間的DDL執行。數據庫自動提交有助于控制數據字典的內存占用,把更多的空間留給DML。
Oracle為了實現DDL可以回滾的功能,且實現多版本讀一致性,那么就必須在DDL發生后,將修改的表鎖定,避免其他會話的訪問造成不一致這會導致Oracle中出現鎖升級的情況,并且嚴重的影響Oracle的并發性,而且會大大增加死鎖產生的幾率要知道,Oracle的鎖機制和多版本讀一致性使得Oracle的并發性在所有數據庫產品中首屈一指。
顯然為了實現DDL的回滾而損失最值得稱道的并發性,Oracle認為得不償失。 ?
延伸閱讀:
二、SQL TRUNCATE TABLE清空表語句
SQL TRUNCATE TABLE 語句用來刪除表中的所有記錄,也即清空表,它類似于不帶 WHERE 子句的 DELETE FROM 語句。
TRUNCATE TABLE 和?DROP TABLE
DROP TABLE 用來刪除表,包括刪除該表的數據、結構、索引、觸發器、約束等所有信息。一旦使用?DROP TABLE 刪除了表,則該表的所有信息都將丟失,該表再也無法使用了。如果您希望存儲一些數據,就只能重新創建該表。
TRUNCATE TABLE 僅僅刪除表的所有記錄,表的結構、索引、觸發器、約束等將被保留,后續仍然可以使用該表。
TRUNCATE TABLE 和 DELETE FROM
不帶 WHERE 子句的?DELETE FROM 語句同樣可以達到清空表的效果,但是?TRUNCATE TABLE 使用的系統資源和日志資源更少,因此比?DELETE FROM 更加快速。
DELETE FROM 語句每刪除一行,都會在事務日志中為所刪除的行記錄一項。TRUNCATE TABLE 通過釋放表中數據所用的數據頁來刪除數據,只會在事務日志中記錄頁的釋放。
此外,TRUNCATE TABLE 還能重置具有自動遞增(AUTO_INCREMENT)屬性的字段,而 DELETE FROM 卻不具備該功能。
總結
當您不再需要該表時,使用 DROP TABLE;當您仍要保留該表,只是想刪除所有記錄時,使用 TRUNCATE TABLE;當你要刪除部分記錄時,使用帶有 WHERE 子句的 DELETE FROM。