我正在開發一個發行DDL的程序。我想知道是否CREATE TABLE
和類似DDL可以是否有可能在主要SQL數據庫中回滾CREATE TABLE和ALTER TABLE語句?
- Postgres的回滾
- MySQL的
- SQLite的
- 等
描述每個數據庫如何處理事務與DDL。
我正在開發一個發行DDL的程序。我想知道是否CREATE TABLE
和類似DDL可以是否有可能在主要SQL數據庫中回滾CREATE TABLE和ALTER TABLE語句?
描述每個數據庫如何處理事務與DDL。
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis從PostgreSQL的角度提供了這個問題的概述。
根據這個文件是DDL交易嗎?
的SQLite也出現也有事務性的DDL。我能夠在SQLite中使用ROLLBACK
a CREATE TABLE
語句。它的CREATE TABLE
文檔沒有提到任何特殊的交易「陷阱」。
儘管並非嚴格意義上的「回滾」,但在Oracle中,如果數據庫已配置爲支持,則可使用FLASHBACK命令撤消這些類型的更改。
PostgreSQL對大多數數據庫對象(當然是表,索引等,但不是數據庫,用戶)具有事務性DDL。但是,實際上任何DDL都會在目標對象上獲得一個ACCESS EXCLUSIVE
鎖定,使其完全無法訪問,直到DDL事務完成。此外,並非所有情況都處理完畢 - 例如,如果您嘗試從表foo
中選擇另一個事務正在刪除它並創建替換表foo
,則被阻止的事務將最終收到錯誤,而不是查找新的foo
表。 (編輯:這是固定在PostgreSQL 9.3之前或之後)
CREATE INDEX ... CONCURRENTLY
是例外,它使用三個事務添加索引到一個表,同時允許併發更新,所以它本身不能在事務中執行。
另外數據庫維護命令VACUUM
不能在事務中使用。
「ACCESS EXCLUSIVE」信息的+1! – 2013-03-12 08:48:28
我認爲如果我嘗試在另一個事務正在刪除並重新創建時從表'foo`中選擇,然後我就OK了ith舊版本或錯誤。我對新版本不滿意,因爲它還沒有提交,所以我不能看到它。我沒有錯,因爲在併發事務訪問中,必須準備重新啓動事務。如果錯誤發生的次數多於必要次數,它可能會降低性能,但它仍然是正確的。 – 2014-06-04 14:39:47
不能與MySQL做似乎很愚蠢..
「在InnoDB中的CREATE TABLE語句被作爲一個單獨的事務。這意味着來自用戶的ROLLBACK不撤銷CREATE TABLE語句事務過程中所做的用戶。」
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
嘗試了幾種不同的方式,它根本不會回滾..
解決方法是簡單地設置一個失敗標誌,如果其中一個查詢失敗,則執行「drop table tblname」。
社區維基? – araqnid 2011-01-14 16:07:45