2017-01-09 63 views
0

在我們的web應用程序運行的linux服務器上,我們也有一個使用 sqlite(它用c編寫)的小應用程序。什麼時候檢查數據庫是否被鎖定在sqlite中的錯誤

對於我們使用以下命令執行數據庫操作:

sqlite3_prepare_v2 
sqlite3_bind_text or sqlite3_bind_int 
sqlite3_step 
sqlite3_finalize 

每一個現在,再有就是併發情況下,我得到了以下錯誤:

database is locked 

所以我想:「這當一個進程寫入某個記錄時,另一個人正在嘗試讀取完全相同的記錄。「

因此,在每一個可能發生碰撞的步驟命令之後,我檢查了這個錯誤。當它發生時,我等了幾毫秒,然後再次嘗試。

但sqlite錯誤「數據庫被鎖定」仍然發生。

所以我改變了每一步命令和它後面的代碼行。不知何故,我認爲這個「數據庫被鎖定」的錯誤只能發生在step命令中。

但錯誤不斷出現。

我的問題是現在:

我必須爲「ERROR_CODE == 5」(數據庫被鎖定)任何sqlite3的命令後檢查?

非常感謝提前

回答

1

如果您收到錯誤代碼5(繁忙),您可以通過使用即時交易限制這一點。如果您能夠立即開始交易,則SQLite保證在您提交前不會收到繁忙的錯誤。

另請注意,SQLite沒有行級鎖定。整個數據庫都被鎖定。使用WAL日誌,您可以讓一位作家和多位讀者閱讀。使用其他日誌記錄方法,您可以擁有一個作者或多個讀者,但不能同時擁有兩個。

SQLite Documentation on 'SQLITE_BUSY'

相關問題