2013-06-12 70 views
2

我正在開發一個QT C++應用程序,它有一個sqlite數據庫。這些表格使用QTableView和QSqlTableModel顯示。有大約10K記錄的表格。QT Sqlite無法讀取行。鎖定數據庫

我的問題是,當我嘗試更新任何記錄到10K記錄的表中時,出現「數據庫已鎖定,無法獲取行」的錯誤。當行數較少時(例如20),這不會發生。日誌文件在應用程序文件夾中創建。似乎有些進程正在鎖定數據庫。找不出實際的原因。

任何人都可以提出一些解決方案嗎?

感謝, 普里

+0

是否有條目數量的靜態限制?添加21個條目時的結果是什麼?它在哪裏破裂? – bobestm

+0

表格可容納的記錄數量沒有限制。對於有更少記錄的表,如果我執行更新查詢,它是成功的,而對於有10K記錄的表,數據庫被鎖定。我沒有檢查表有多少記錄沒有被鎖定。我可以檢查並回復你 –

+0

我相信這是你的表上的一個常見的鎖問題,因爲你有很多條目,在插入/更新期間鎖定表(不管)需要這麼長時間,數據庫等待其內部一個操作超時(實際允許寫入更改之前的時間)並引發此錯誤。你可以看看'PRAGMA locking_mode = EXCLUSIVE' – Najzero

回答

3

在Qt,您發送PRAGMA到你的數據庫是這樣的:

dbObj = QSqlDatabase::addDatabase(...); 
dbObj.setDatabaseName(...); 
dbObj.open(); 
dbObj.exec("PRAGMA locking_mode = EXCLUSIVE"); 

不過,我不認爲這是你想要的。從Qt文檔:

在執行選擇時鎖定驅動程序以進行更新。這可能會導致使用QSqlTableModel時出現問題,因爲Qt的項目視圖根據需要獲取數據(在QSqlTableModel的情況下使用SqlQuery :: fetchMore())。

看看QSqlQuery :: isActive它說:

返回true,如果查詢是有效的。一個活動的QSqlQuery是exec()成功但尚未完成的。完成活動查詢後,可以通過調用finish()或clear()使查詢處於非活動狀態,也可以刪除QSqlQuery實例。

底線是,你有一個阻塞查詢來自的地方,你要麼需要適當地做出「不活動」或者,你需要有仲裁始發。

0

檢查是否有sqlite數據庫在另一個窗口中打開。我有同樣的問題,但後來發現我在數據庫的另一個打開的窗口中有未保存的更改。一旦該實例關閉,所有工作都很完美。