2011-01-14 51 views

回答

107

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis從PostgreSQL的角度提供了這個問題的概述。

根據這個文件是DDL交易嗎?

  • PostgreSQL的 - 是
  • MySQL的 - 無; DDL導致默認提交
  • Oracle數據庫11g第2版及更高版本 - 默認情況下不存在,但存在一種稱爲基於版本的重新定義的替代方案
  • 舊版本的Oracle - no; DDL引起的隱式提交
  • SQL服務器 - 是
  • Sybase Adaptive Server的 - 是
  • DB2 - 是
  • Informix的 - 是
  • 火鳥(Interbase的) - 是

的SQLite也出現也有事務性的DDL。我能夠在SQLite中使用ROLLBACK a CREATE TABLE語句。它的CREATE TABLE文檔沒有提到任何特殊的交易「陷阱」。

3

儘管並非嚴格意義上的「回滾」,但在Oracle中,如果數據庫已配置爲支持,則可使用FLASHBACK命令撤消這些類型的更改。

19

PostgreSQL對大多數數據庫對象(當然是表,索引等,但不是數據庫,用戶)具有事務性DDL。但是,實際上任何DDL都會在目標對象上獲得一個ACCESS EXCLUSIVE鎖定,使其完全無法訪問,直到DDL事務完成。此外,並非所有情況都處理完畢 - 例如,如果您嘗試從表foo中選擇另一個事務正在刪除它並創建替換表foo,則被阻止的事務將最終收到錯誤,而不是查找新的foo表。 (編輯:這是固定在PostgreSQL 9.3之前或之後)

CREATE INDEX ... CONCURRENTLY是例外,它使用三個事務添加索引到一個表,同時允許併發更新,所以它本身不能在事務中執行。

另外數據庫維護命令VACUUM不能在事務中使用。

+0

「ACCESS EXCLUSIVE」信息的+1! – 2013-03-12 08:48:28

+0

我認爲如果我嘗試在另一個事務正在刪除並重新創建時從表'foo`中選擇,然後我就OK了ith舊版本或錯誤。我對新版本不滿意,因爲它還沒有提交,所以我不能看到它。我沒有錯,因爲在併發事務訪問中,必須準備重新啓動事務。如果錯誤發生的次數多於必要次數,它可能會降低性能,但它仍然是正確的。 – 2014-06-04 14:39:47

0

不能與MySQL做似乎很愚蠢..

「在InnoDB中的CREATE TABLE語句被作爲一個單獨的事務。這意味着來自用戶的ROLLBACK不撤銷CREATE TABLE語句事務過程中所做的用戶。」

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

嘗試了幾種不同的方式,它根本不會回滾..

解決方法是簡單地設置一個失敗標誌,如果其中一個查詢失敗,則執行「drop table tblname」。