SQLite數據庫本身用來處理鎖定情況的兩個函數:
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
int sqlite3_busy_timeout(sqlite3*, int ms);
使用這兩個函數可以設定當發生數據庫鎖定的時候,調用什么函數來處理,以及設定鎖定時的等待時間。
當然通常情況下我們還可以用另外一種方法來解決這類問題,那便是設置互斥量。一般情況下我們可以使用互斥量,臨界區等來實現。在這里我使用了互斥量,主要是因為我需要在多個不同的進程中并發的訪問同一個數據庫。用于鎖定和解鎖的函數如下:
void Lock()
{
if((hCounter = OpenMutex(MUTEX_ALL_access,FALSE,"kangxiaofang")) == NULL)
{
//如果沒有其他進程創建這個互斥量,則重新創建
hCounter = CreateMutex(NULL,FALSE,"kangxiaofang");
WaitForSingleObject(hCounter,INFINITE);
}
else
{
WaitForSingleObject(hCounter,INFINITE);
}
}
void UnLock()
{
//釋放使用權
ReleaseMutex(hCounter);
//關閉句柄
CloseHandle(hCounter);
}
當然我們也可以把等待時間設定為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();
總結:
經過測試后,你會發現這種方法所需的消耗要小于循環打開數據庫的操作。
新聞熱點
疑難解答