国产探花免费观看_亚洲丰满少妇自慰呻吟_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();

總結:

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴安县| 安国市| 石渠县| 东宁县| 秦皇岛市| 滨海县| 宜阳县| 永州市| 会理县| 龙游县| 香河县| 陇川县| 封开县| 固安县| 秭归县| 鄂尔多斯市| 安泽县| 新河县| 大田县| 永平县| 榕江县| 合阳县| 瓮安县| 新泰市| 高青县| 政和县| 当涂县| 安泽县| 桂林市| 永春县| 元谋县| 安乡县| 探索| 招远市| 牟定县| 五常市| 友谊县| 临江市| 淳安县| 通州市| 翁牛特旗|