我有使用SQLite(3.7.3)避免sqlite3的數據庫鎖定
我打的數據庫鎖定錯誤,這似乎是相當普遍的多線程應用程序。 我想知道如何避免它在我的情況。
讓我來描述一下我正在建造的東西。對不起,沒有代碼太大又複雜。
我有大約8個線程同時訪問數據庫。這些線程中的任何一個都可以同時讀取或寫入。
數據庫表中的每一行都有一個文件路徑,指向一個資源+與該資源相關的其他屬性。
3個值得注意的領域是讀者,狀態和del。
讀者是每個線程從資源讀取時間增加,但只有當狀態> 0,德爾= 0
讓我有些SQL,做
UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0
在那之後,我檢查更新的行數。它應該只有1. 之後,我嘗試用select讀取行。我這樣做,即使它不能更新 ,因爲我需要知道它失敗的原因。
我嘗試在事務中包裝更新和選擇,但沒有幫助。 我已經檢查過,我也打電話給我的發言。
現在,我認爲sqlite默認序列化。我嘗試了幾個開放模式,但我仍然得到相同的錯誤。
在你問之前,不,我不打算去mysql。我絕對需要零配置。
有人可以提供一些關於如何避免這種類型的問題的指針嗎?我應該將閱讀器鎖定在數據庫之外嗎?如果我這樣做,我應該用什麼機制來替代它?我在C++下使用Linux,並使用boost庫。
編輯: 有趣的是,在更新後的呼叫中添加COMMIT可以大大改善事情。
提交更經常可以在數據庫文件上實現更細粒度的EXCLUSIVE鎖,這將減少讀者在表中等待解鎖的時間。這是以增加的日誌文件開銷爲代價的。查看http://sqlite.org/lockingv3.html#writing瞭解更多信息。 – checker 2014-02-20 23:58:28