2009-06-17 54 views
37

我正在調查SQLite作爲存儲引擎,並且很想知道SQLite是否在讀取時鎖定數據庫文件。SQLite是否鎖定讀取數據庫文件?

我很關心讀取性能,因爲我的計劃項目很少寫入,但有很多讀取。如果數據庫確實鎖定,是否可以採取措施(例如內存緩存)來緩解這種情況?

回答

42

從它Wikipedia page

若干計算機的進程或線程可以毫無問題訪問同一數據庫。可以同時滿足多個讀取訪問。

更確切地說,從它的FAQ

多個進程可以同時打開同一個數據庫。多個進程可以同時做一個SELECT。但是,只有一個過程可以隨時對數據庫進行更改。

中單次寫入到然而數據庫,確實鎖定數據庫的時間很短所以沒有什麼可以在任何訪問它(甚至不讀)。詳情請參閱File Locking And Concurrency In SQLite Version 3。基本上讀取數據庫是沒有問題的,除非有人想立即寫入數據庫。在這種情況下,數據庫將被鎖定專門用於執行該事務所需的時間,然後鎖定會被釋放。然而,關於在PENDING或EXCLUSIVE鎖定期間對數據庫的讀取操作究竟有哪些細節並不多見。我的猜測是他們要麼返回SQLITE_BUSY要麼阻止他們閱讀。在第一種情況下,再次嘗試應該不會太難,特別是如果您希望少寫幾篇。

38

如果將數據庫日記模式設置爲預寫日誌記錄(請參閱:http://www.sqlite.org/wal.html),則可以在讀取時避免鎖定。

+4

這比在WAL模式可用之前編寫的接受的答案要好。 – Stretch 2012-09-13 05:44:53