在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()
{
if((hCounter = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"kangxiaofang")) == NULL)
{
//如果沒有其他進程創建這個互斥量,則重新創建
hCounter = CreateMutex(NULL,FALSE,"kangxiaofang");
WaitForSingleObject(hCounter,INFINITE);
}
else
新聞熱點
疑難解答