Locking
如何防止 SQLite 數據庫鎖?
從 SQLite FAQ 我知道:
多個程序可以同時打開同一個數據庫。多個程序可以
SELECT
同時進行。但是,任何時候只有一個程序可以對數據庫進行更改。所以,據我了解,我可以:1)從多個執行緒(
SELECT
)讀取數據庫 2)從多個執行緒( )讀取數據庫SELECT
並從單執行緒(CREATE
,,INSERT
)寫入DELETE
但是,我讀到了Write-Ahead Logging,它提供了更多的並發性,因為reader 不會阻塞 writer,而 writer 不會阻塞 reader。讀和寫可以同時進行。
最後,當我找到它時,我完全糊塗了,當指定時:
以下是獲得 SQLITE_LOCKED 錯誤的其他原因:
- 在語句仍處於未決狀態時嘗試訪問表
CREATE
或DROP
索引。SELECT
- 嘗試在 a 在同一張表上處於活動狀態時寫入
SELECT
表。- 如果未設置 sqlite,則嘗試
SELECT
在多執行緒應用程序中同時在同一張表上執行兩個操作。- fcntl(3,F_SETLK 對 DB 文件的呼叫失敗。這可能是由 NFS 鎖定問題引起的,例如。解決此問題的一種方法是將 DB 移走,然後將其複制回來,使其具有新的 Inode 值
所以,我想為自己澄清一下,有必要避免鎖定嗎?我可以從兩個不同的執行緒同時讀寫嗎?謝謝。
您連結的那個頁面除了很舊之外,還談到了通過同一數據庫連接(或通過共享記憶體模式下的多個連接,您不應該使用)從同一程序進行的訪問。
當不處於 WAL 模式時,多個連接可以從同一個數據庫中讀取,但寫入事務是獨占的,即不允許其他讀取器或寫入器。
在 WAL 模式下,一個 writer 和 reader 不會互相阻塞,但仍然只允許一個 writer。