2016-12-14 26 views
0

我一直在閱讀SQLite的文檔,也參考了我以前寫過的代碼,但我似乎無法找到一個明確的答案,我認爲這是一個相當簡單的問題。事務如何在SQLite中進行分區/隔離?

我想在一個事務中執行多個(獨立)編譯的語句,但是子線程也可以創造交易或只是在同一時間執行的語句,我不希望他們包括在這個特定的交易。目前,我在所有線程之間共享一個數據庫句柄。

所以,我的問題是,

1)......是一般最好是有某種圍繞交易信號,以確保它們不會衝突/與對數據庫手柄正在執行其他語句收集。爲了防止SQLite遇到多線程問題,我已經編寫了一些寫操作(儘管現在使用WAL很難徹底解決它)。

2)..或者你是否希望打開多個數據庫連接並在數據庫連接上啓動/提交一個事務(如果它們是併發的)?

+0

對不起,我沒有辦法,因爲它被標記爲重複。現在會這樣做。謝謝。 –

回答

0

在提交之前,在一個數據庫連接中所做的更改對所有其他數據庫連接都是不可見的。

因此,似乎有幾個連接開放的數據庫提供足夠的併發保障,權衡打開與允許多線程寫入交易的好處一個新的連接爲代價的混合方法。

查詢看到已完成的查詢開始前到同一個數據庫連接,無論與否的修改已經提交的所有更改。

如果查詢開始運行,但在查詢完成之前,那麼它是不確定的查詢是否會看到這些更改後的同一個數據庫連接上發生的變化。

如果查詢開始運行,但在查詢完成之前,則該查詢可能會返回更改的行不止一次,或者它可能返回以前刪除的行後,在同一個數據庫連接上發生的變化。

就前四項而言,使用相同共享緩存並啓用PRAGMA read_uncommitted的兩個數據庫連接被視爲是相同的數據庫連接,而不是單獨的數據庫連接。


這裏是SQLite information on isolation。這對於閱讀和理解這個問題非常有用。