2013-06-12 30 views
0

我在Fedora linux中使用sqlite3 3.6.23.1版本。我有兩個線程正在運行以訪問數據庫。有可能兩個線程都會嘗試執行寫入操作表。Sqlite3如何識別表鎖定狀態,然後插入

當第一個線程執行寫入操作時,表被鎖定。我該如何處理這種情況。

是否有任何C,sqlite3 API機制像等待,然後寫入表中,直到另一個線程完成寫入操作。

謝謝&此致敬禮。

-praveen

回答

1

沒有可經由C API所描述here設定的「共享高速緩存」模式。

Sqlite3在最大化併發性方面做得很好,而且它也是線程安全的。有關更多詳細信息,請參閱File Locking and Concurrency document

在寫入操作期間,表確實被鎖定,但是sqlite3能夠通過等待釋放鎖來導航此條件,然後將鎖授予第二個想要執行操作的進程/線程寫(或讀)。等待鎖定超時可以在你的sqlite連接代碼中配置。以下是Python 2.7的語法:

sqlite3.connect(database[, timeout, detect_types, isolation_level, 
       check_same_thread, factory, cached_statements]) 

默認的超時時間是5.0秒。所以需要一個相當龐大的SELECT或COMMIT事務來保持這段時間的鎖定。然而,根據您的使用情況,您可以調整超時或包含代碼以捕獲超時異常。

最後一個選擇是在代碼中加入某種標記機制,它需要競爭線程等待一個標誌在嘗試訪問數據庫之前清除,但是這重複了滿足併發性的sqlite3開發人員的努力情景作爲他們工作的主要部分。

這裏有一篇有趣的文章概述了一個問題,older versions of sqlite may sleep for a whole second無法獲取鎖定。