2015-11-30 26 views
2

我知道(或者至少,我認爲,我知道),在標準的存在與交易處理時四種隔離級別:如何設置SQLite的隔離級別,使用Python

READ UNCOMMITTED - will allow everything 
READ COMMITTED - will not allow dirty reads 
REPEATABLE READ - will not allow dirty, non-repearable reads 
SERIALIZABLE - will not allow dirty, non-repearable, phantom reads 

我知道這一點, ,例如,用MySQL打交道時,我可以這樣做:

cursor = db.cursor() 
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED") 

或者,如果我處理Postgre,我可以這樣做:

db.set_isolation_level(3) # corresponds to SERIALIZABLE 

所以,我想知道,如果我能做些類似於處理SQLite時的情況。我只看到:

db.isolation_level = None 

,但我不知道這意味着什麼,我怎麼可以設置其他隔離級別(如果他們在SQLite背景下存在)。謝謝!

回答

3

在sqlite中有PRAGMA statements。看來你可以這樣做:

db.execute("PRAGMA read_uncommitted = true;"); 
+0

謝謝,先生!我只想澄清一件小事--sqlite是否支持所有隔離級別?那麼,你的例子可以用於'read_commited',''repeatable read''和'serializable'嗎? – Jacobian

+2

@Jacobian SQLite中的所有事務都是'SERIALIZABLE',除非它們使用共享緩存,並且在Martin注意到'read_uncommitted'設置爲true。 –

1

爲了擴大對馬丁的回答......

SQLite中的所有交易都SERIALIZABLE,因爲SQLite的控制通過一個數據庫範圍內的讀寫鎖併發,因此有一次只能是一名作家。

的例外是如果已經在相同的工藝設置shared cache mode兩個或多個連接之間和啓用the read_uncommited pragma,在這種情況下,這些連接可以在READ UNCOMMITED模式下操作(但是在共享高速緩存的外連接將阻止它們作爲通常)。

+0

謝謝,先生!但我仍然沒有得到一件小事。這是否意味着爲了在使用Python的SQLite中實現真正可seizalizable的事務,我不必做任何事情,比如'db.isolation_level = None'和'db.execute(「PRAGMA read_uncommitted = true;」)''?簡單的'cursor.execute(「開始」)','cursor.execute(command_1)','cursor.execute(「command_2」)','cursor.execute(「commit」)'就足夠了? – Jacobian

相關問題