sqlite資料庫在使用的過程中經常發生的資料庫異常便是資料庫被鎖定了(sqlite_busy或者sqlite_locked)。
sqlite對於併發的處理機制是允許同乙個程序的多個執行緒同時讀取乙個資料庫,但是任何時刻只允許乙個執行緒/程序寫入資料庫。
所以必須要對資料庫的讀寫來進行控制。
sqlite資料庫本身用來處理鎖定情況的兩個函式:
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
int sqlite3_busy_timeout(sqlite3*, int ms);
使用這兩個函式可以設定當發生資料庫鎖定的時候,呼叫什麼函式來處理,以及設定鎖定時的等待時間。
當然通常情況下我們還可以用另外一種方法來解決這類問題,那便是設定互斥量。一般情況下我們可以使用互斥量,臨界區等來實現。在這裡我使用了互斥量,主要是因為我需要在多個不同的程序中併發的訪問同乙個資料庫。用於鎖定和解鎖的函式如下:
void lock()
else
}void unlock()
當然我們也可以把等待時間設定為60秒,以免出現死等的現象。具體使用時可以按如下呼叫:
//鎖定資料庫
lock();
rc = sqlite3_exec(db, "begin;", 0, 0, &zerrmsg);
rc = sqlite3_exec(db, exec, 0, 0, &zerrmsg);
rc = sqlite3_exec(db, "commit;", 0, 0, &zerrmsg);
//資料庫解鎖
unlock();
總結:
經過測試後,你會發現這種方法所需的消耗要小於迴圈開啟資料庫的操作。
資料庫鎖定
在很多客戶一起查詢資料表時,如果使客戶能最快地查詢到資料就是排程和鎖定做的工作了。在mysql中,我們把select操作叫做讀,把對資料表修改增加的操作 insert,update,replace.叫做寫。mysql的基本排程策略可以歸納為以下兩條 寫入請求將按它們到達伺服器的順序進行處理 寫操作的...
資料庫表 行 資料庫鎖定
1如何鎖乙個表的某一行 settransaction isolation level read uncommitted select from table rowlock where id 1 2鎖定資料庫的乙個表 select from table with holdlock 加鎖語句 sybas...
mysql資料庫鎖定機制
為了保證資料的一致完整性,任何乙個資料庫都存在鎖定機制。鎖定機制的優劣直接應想到乙個資料庫系統的併發處理能力和效能,所以鎖定機制的實現也就成為了各種資料庫的核心技術之一。下面將對 mysql 的 innodb 各自的鎖定機制進行較為詳細的分析。總的來說,mysql 各儲存引擎使用了三種型別 級別 的...