Locking

如何防止 SQLite 數據庫鎖?

  • June 28, 2013

從 SQLite FAQ 我知道:

多個程序可以同時打開同一個數據庫。多個程序可以SELECT同時進行。但是,任何時候只有一個程序可以對數據庫進行更改。

所以,據我了解,我可以:1)從多個執行緒(SELECT)讀取數據庫 2)從多個執行緒( )讀取數據庫SELECT並從單執行緒(CREATE,,INSERT)寫入DELETE

但是,我讀到了Write-Ahead Logging,它提供了更多的並發性,因為reader 不會阻塞 writer,而 writer 不會阻塞 reader。讀和寫可以同時進行。

最後,當我找到時,我完全糊塗了,當指定時:

以下是獲得 SQLITE_LOCKED 錯誤的其他原因:

  • 在語句仍處於未決狀態時嘗試訪問表CREATEDROP索引。SELECT
  • 嘗試在 a 在同一張表上處於活動狀態時寫入SELECT表。
  • 如果未設置 sqlite,則嘗試SELECT在多執行緒應用程序中同時在同一張表上執行兩個操作。
  • fcntl(3,F_SETLK 對 DB 文件的呼叫失敗。這可能是由 NFS 鎖定問題引起的,例如。解決此問題的一種方法是將 DB 移走,然後將其複制回來,使其具有新的 Inode 值

所以,我想為自己澄清一下,有必要避免鎖定嗎?我可以從兩個不同的執行緒同時讀寫嗎?謝謝。

您連結的那個頁面除了很舊之外,還談到了通過同一數據庫連接(或通過共享記憶體模式下的多個連接,您不應該使用)從同一程序進行的訪問。

當不處於 WAL 模式時,多個連接可以從同一個數據庫中讀取,但寫入事務是獨占的,即不允許其他讀取器或寫入器。

在 WAL 模式下,一個 writer 和 reader 不會互相阻塞,但仍然只允許一個 writer。

引用自:https://dba.stackexchange.com/questions/45368