數(shù)據(jù)庫只有在事務(wù)中才能被修改。 所有更改數(shù)據(jù)庫的SQL命令(除SELECT以外的所有SQL命令)都會自動開啟一個新的事務(wù),并且當(dāng)最后一個查詢完成時自動提交。
threadsafe就是指在設(shè)置正確的前提下,多線程同時訪問SQLite并不會影響數(shù)據(jù)庫的完整性,而不是說每個線程對數(shù)據(jù)庫所有的操作都可以保證正確執(zhí)行?。?!經(jīng)過實(shí)際測試我才意識到這個問題。
不論是設(shè)置成SQLITE_CONFIG_SERIALIZED還是SQLITE_CONFIG_MULTITHREAD,多個線程(每個線程使用一個數(shù)據(jù)庫連接)執(zhí)行的時候,三個步驟(prepare_v2、step、finalize)都會出現(xiàn)SQLITE_BUSY(5)的錯誤。 雖然,不會影響數(shù)據(jù)庫中的數(shù)據(jù)完整性, 但是,一旦在程序中操作失敗,而我們又沒有檢查返回值,直接會影響程序邏輯的正確性(簡單說,本意為會插入的數(shù)據(jù)并沒有插進(jìn)數(shù)據(jù)庫)。 所以,顯然不可以直接讓多線程去操作數(shù)據(jù)庫。
解決方法:
1.在每個線程操作數(shù)據(jù)庫時,手動加鎖
2.形成一個操作隊(duì)列,統(tǒng)一去操作數(shù)據(jù)庫