sqlite併發寫處理

2021-06-09 12:00:25 字數 1040 閱讀 9639

在模擬面試的時候被問到了sqlite寫入併發的處理,因為之前完全沒有併發的問題,曾經在乙個資料上說sqlite本身有自己的鎖可以防止併發問題,所以我回答的就是我程式中沒有遇到寫入失敗的問題,sqlite本身會處理併發的問題,具體怎麼處理的我不太清楚,他們問我如果遇到這個問題怎麼解決我也沒回答上來。

這兩天一直在糾結這個問題,一直也沒時間查詢這個問題的答案,今天上午自己測試了一下確實同時寫入資料庫的時候會出現寫入失敗的問題,sqlite3_exec執行寫的時候會自己加乙個排他鎖,所以兩個寫入操作同時進行會出現乙個寫入失敗的問題。在網上查詢解決方法的時候都說sqlite在讀取操作的時候支援多個讀,一旦有了寫入的操作只能同一時間一次寫入,原因就是sqlite是檔案型的資料庫,這樣我們寫入資料庫的時候就可以採用兩種方法解決併發問題:

在多執行緒程式設計中: 1、

採用迴圈解決:如果寫入操作不是特別頻繁的時候即兩次寫入時間間隔較長的時候可以在sqlit3_exec外加一死迴圈,執行sqlite3_exce的時候判斷執行是否成功,如果成功則退出迴圈,如果失敗繼續執行迴圈。這樣可以保證每個寫入操作都能執行,bug就是如果每個執行緒的寫入操作間隔時間較短的時候就會出現有執行緒死在那裡的現象。 2、

採用互斥鎖解決:在程式初始化的時候初始化乙個互斥鎖,每次執行sqlite_exec的時候加鎖,執行完之後解鎖,這樣可以保證每個執行緒都能執行寫入操作,獲取鎖的時候會有阻塞等待的情況,每次sqlite3_exec執行的速度很快,等待時間可以忽略不計。

在多程序程式設計中: 1、

採用迴圈解決:如果寫入操作不是特別頻繁的時候即兩次寫入時間間隔較長的時候可以在sqlit3_exec外加一死迴圈,執行sqlite3_exce的時候判斷執行是否成功,如果成功則退出迴圈,如果失敗繼續執行迴圈。這樣可以保證每個寫入操作都能執行,bug就是如果每個執行緒的寫入操作間隔時間較短的時候就會出現有執行緒死在那裡的現象。 2、

採用檔案鎖解決:資料庫本身是檔案型的,但是我們不能通過fcntl給資料庫加鎖,所以我們新建乙個普通的檔案作為資料庫的檔案鎖的替代檔案。在每次寫入的時候加鎖,寫入之後解鎖,因為檔案鎖平台移植性更強。也可以採用共享記憶體的方法解決,獲取執行緒互斥鎖也可以,但是要設定互斥鎖的屬性。

SQLite的併發處理

使用sqlite經常會遇到併發處理,要處理好多執行緒或多程序之間的併發,就得搞清楚sqlite的機制,尤其是sqlite的鎖機制。因為sqlite是檔案資料庫,所以它的鎖也基本是和檔案一致,也即 寫獨佔,讀共享。這意味是在讀取資料庫的時候,是可以多個執行緒共享的,而如果有增刪改的操作,則會獨佔此檔案...

SQLite 預寫式日誌

sqlite在3.7.0版本引入了wal write ahead logging wal的全稱是write ahead logging,它是很多資料庫中用於實現原子事務的一種機制,引入wal機制之前,sqlite使用rollback journal機制實現原子事務。rollback journal機...

map併發寫問題

var wg sync.waitgroup m make map int int for i 0 i 10 i wg.add 10 for i 0 i 10 i i,m wg.wait fatal error concurrent map iteration and map write map 0 ...