2016-03-28 103 views
0

讀取交易:https://www.sqlite.org/isolation.html可以在SQLite中長時間保持讀事務處於打開狀態嗎?

我們假設WAL已啓用,因此我們可以在一個步驟中讀取另一個正在寫入的數據。


我想達到的是這樣的。

我有兩個線程,一個是UI線程,有時會執行數據庫讀取,另一個是數據庫線程,執行數據庫讀取/寫入事務。

UI線程中的結果被高速緩存,有時會有不完整的信息,比如對於事物列表,我們只查詢列表的大小,或者只查詢該查詢的前10項,然後我們會在UI到達那個部分。

而在db線程上,我們將執行事務並記住所有更改,然後發佈(UI線程是looper線程)對UI線程的更改並逐步更新UI緩存,以便它儘可能少地阻塞UI線程可能。

問題是當db事務完成時,UI線程可能會在循環線程處理該消息之前觸發UI線程上的數據庫讀取,也是由於UI框架的某些限制工作,我們無法更新緩存,因爲UI線程正在使用它。

因此,我的想法是在UI線程上,在發生任何查詢之前,開始讀取事務(以延遲模式開始事務,並且此事務不會因爲沒有寫入而鎖定數據庫),則發生任何讀取UI線程將在此事務中發生,然後循環線程獲取更新信息,結束事務並更新緩存,然後開始另一個。因此,數據庫和緩存在UI線程中被轉換爲新狀態,並被同步。


因此,我可以保持一個長時間的讀取事務嗎?

回答

0

所有讀取操作都在一個事務中完成(如果需要,會自動完成),並且所有事務鎖定數據庫。但是,WAL模式中的只讀鎖只能阻止checkpoint operations

只要不斷增長的WAL文件不會溢出磁盤,長時間處於活動狀態就沒有問題。 如果您需要交易讓您的應用程序正常工作,則無論如何您都沒有選擇 - 另一種方法是手動實施一些類似的交易機制,最好讓數據庫處理此問題。

+0

並沒有性能影響的權利? – molikto

+0

可能不是。但是可以肯定的是,你必須測量。 –

相關問題