2012-08-06 114 views
1

我正在使用C++ shell擴展DLL,它用於讀取數據到SQLite數據庫表中並將數據寫入數據庫。還有另一個應用程序(exe)用於訪問所有表。SQLite數據庫文件在插入/刪除期間被鎖定

有時,當我嘗試刪除/插入/更新到SQLite數據庫表時,我的dll顯示異常「數據庫文件被鎖定」。這是因爲其他應用程序此時正在訪問表。

有沒有什麼辦法可以解決這個問題從我的DLL?我是否可以使用該解決方案爲在鏈接中提到:「http://stackoverflow.com/questions/6455290/implementing-sqlite3-busy-timeout-in-an-ios-app

在當前的代碼,我正在使用CppSQLite3.cpp方法execQuery(const char * szSQL)來執行SQL查詢。

請指教。

回答

0

首先,你應該知道的SQLite做了數據庫級鎖。當你啓動一個事務並且另一個應用程序試圖向同一個數據庫寫入內容時,你會得到Database is locked,並且SQLite會自動嘗試在sqlite3_busy_timeout間隔後執行相同的查詢。

因此,關鍵是要確保你保持你的交易是儘可能短即
1.做一個開始交易
2.更新/刪除/插入
3.提交

,而不是這三個步驟之間還有其他任何東西。 並且還會根據交易的規模增加您的sqlite3_busy_timeout間隔以適應您的應用程序。

您可以嘗試WAL模式,在此模式下可以同時讀取和寫入SQLite。但它有它自己的一套缺點。你可以參考SQLite documentation

+0

謝謝@ DJK。謝謝omggs。我們的exe和DLL應用程序正在訪問相同的數據庫表。 Exe訪問table1,table2和table3。 DLL正在訪問table1和table2。問題是Exe-table3插入需要更長的時間。這導致數據庫文件鎖定方案。我認爲解決方法是將table3移動到另一個數據庫。我認爲這會解決我們的問題 – JChan 2012-08-07 14:49:22

+0

@JChan:不客氣!當然,您可以將表移動到另一個數據庫或增加適合您的應用程序的繁忙時間! – omggs 2012-08-08 04:37:44