2015-12-02 122 views
3

我現在知道MySQL存在導致隱性承諾,像CREATEALTER等語句的長隆list我想知道是否有這樣的事情在SQLite交易SQLite中

換句話說,我想知道例如CREATE TABLE和其他一些構造是否會導致自動提交,因此無法回滾?

我自己對它進行了測試,在我看來,就像SQLite的行爲類似於MySQL,但我不確定這一點,我希望對列出所有這些命令的文檔有一些參考(我找不到它) 。

此外,我想知道是否可以調整一些sqlite參數,以防止它形成自動提交CREATE和其他語句。

編輯

一個額外的思考。我們都知道,例如,無法重命名SQLite中的字段或更改其類型(使用一個命令),但爲此,我們必須創建一個具有所需模式的新表並將數據導入到此表中。顯然,這樣的操作應該在單個事務中執行,但是如果實際上CREATE TABLEDROP TABLE命令會導致自動提交?

相反實施

import sqlite3 

cnx = sqlite3.connect("test.db") 
cursor = cnx.cursor() 
cursor.execute("CREATE TABLE funky (attr_1_ integer)") 
cnx.rollback() 

正如你所看到的,我不使用任何特殊的編譯,我甚至不提交明確的,但是當我運行它,然後去SQLITE3提示,我看到表funky仍然存在。

回答

3

對於一些特殊的程序(foreign_keysjournal_mode)外,所有SQL命令是fully transactional

不可更改的數據庫事務之外,製成。

只有當你不使用顯式事務的SQLite將使用autocommits:

任何修改數據庫的命令(基本上除了SELECT之外的任何SQL命令)會自動如果一個人開始交易尚未生效。自動啓動的事務在最後一次查詢完成時提交。


爲了能夠回滾一個CREATE TABLE,你必須

  • 使用明確的事務,並
  • (只在Python)禁用Python的autocommit mode
import sqlite3 

cnx = sqlite3.connect("test.db") 
cnx.isolation_level = None 
cursor = cnx.cursor() 
cursor.execute("BEGIN") 
cursor.execute("CREATE TABLE funky (attr_1_ integer)") 
cursor.execute("ROLLBACK") 
+0

如果你能詳細闡述一下,這將是很好的。事實是,我自己的測試沒有使用任何特殊的雜注顯示,例如'CREATE TABLE' autocommits。我猜還有另外一些命令也會導致隱式提交。所以,如果你能用可證實的例子來支持你的想法,那就太好了。 – Jacobian

+0

這個問題是關於SQLite的,而不是關於[Python被誤導爲聰明的嘗試](https://docs.python.org/2/library/sqlite3.html#sqlite3-controlling-transactions)。 –

+0

我會接受你的答案,如果你有點冗長。現在我無法理解你在這兩個短句中的實際含義。 – Jacobian