国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

SQLite數據庫用來處理鎖定情況的兩個函數

2024-07-21 02:43:42
字體:
來源:轉載
供稿:網友
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

{

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();

總結:

經過測試后,你會發現這種方法所需的消耗要小于循環打開數據庫的操作。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 古交市| 思南县| 茂名市| 文登市| 扬州市| 化德县| 保靖县| 民县| 玛曲县| 凤城市| 龙口市| 茌平县| 依兰县| 德江县| 江安县| 莎车县| 梁平县| 济南市| 时尚| 玛沁县| 丰镇市| 田阳县| 繁峙县| 汨罗市| 收藏| 临高县| 水城县| 革吉县| 汉沽区| 济南市| 孟村| 罗平县| 英德市| 贵溪市| 崇文区| 衡阳县| 余庆县| 监利县| 神农架林区| 昌图县| 安平县|