使用sqlite經常會遇到併發處理,要處理好多執行緒或多程序之間的併發,就得搞清楚sqlite的機制,尤其是sqlite的鎖機制。
因為sqlite是檔案資料庫,所以它的鎖也基本是和檔案一致,也即:寫獨佔,讀共享。這意味是在讀取資料庫的時候,是可以多個執行緒共享的,而如果有增刪改的操作,則會獨佔此檔案,其他執行緒會程序都會被阻塞。
對於每個sqlite的api執行,都需要妥善處理返回值,尤其是sql_busy的時候。
當乙個執行緒獨佔資料庫時,其他執行緒無論是查詢還是寫入,都可能返回sql_busy,這個時候,有幾種處理方式:
1,使用作業系統的鎖,比如訊號量和mutex,把執行寫入的操作**框在臨界區內。
handle hmutex =null;
hmutex = createmutex(null, true, null);
waitforsingleobject(hmutex, infinite);
sqlite operation;
releasemutex(hmutex);
2,讓其他執行緒在遇到sql_busy的時候重試。
exec:
int nret = sqlite3_exec(db, sql, null, null, errmsg);
if(nret== sql_busy)
注意個人設定重試次數,以免死鎖。
3,經測試,在顯式地開啟了事務後,其他執行緒似乎會預設等待,到事務執行完成後再進入臨界區。相當於sqlite引擎做了第1種方案做的事。
sqlite併發寫處理
在模擬面試的時候被問到了sqlite寫入併發的處理,因為之前完全沒有併發的問題,曾經在乙個資料上說sqlite本身有自己的鎖可以防止併發問題,所以我回答的就是我程式中沒有遇到寫入失敗的問題,sqlite本身會處理併發的問題,具體怎麼處理的我不太清楚,他們問我如果遇到這個問題怎麼解決我也沒回答上來。這...
Qt中針對SQLite的併發訪問
問題 sqlite是一種檔案級別的資料庫,因此他的鎖機制也是檔案級別的,只支援併發讀訪問資料庫,不支援併發寫,也不支援併發讀寫。只要有乙個執行緒進行寫操作,其他執行緒都將等待,如果同時執行讀寫操作,會返回sqlite busy。因此對於寫操作是需要序列執行的。解決方案 qsqlerror noerr...
高併發的處理
前幾天面試的時候被人問到,關於高併發的處理。無奈自己只知道從sql語句和表分割槽索引,靜態頁,快取等優化。其他的優化方法不了解。今天搜尋了下資料,找到幾種解決方案。1 html靜態化 2 伺服器分離 3 資料庫集群和庫表雜湊 4 快取 5 映象 6 負載均衡 乙個典型的使用負載均衡的策略就是,在軟體...