問題:sqlite是一種檔案級別的資料庫,因此他的鎖機制也是檔案級別的,只支援併發讀訪問資料庫,不支援併發寫,也不支援併發讀寫。只要有乙個執行緒進行寫操作,其他執行緒都將等待,如果同時執行讀寫操作,會返回sqlite_busy。因此對於寫操作是需要序列執行的。解決方案:
qsqlerror::noerror 0 沒有錯誤發生重新翻了翻qt assistant,在qsqldatabase頁的qsqlerror::connectionerror 1 (資料庫)連線錯誤
qsqlerror::statementerror 2 sql語句語法錯誤
qsqlerror::transactionerror 3 事務失敗錯誤
qsqlerror::unknownerror 4 未知錯誤
void qsqldatabase::setconnectoptions(const qstring &options = qstring())
讓我找到了qsqlite_busy_timeout
文件中關於這些option的使用也提供了乙個例子:
// mysql connection
db.setconnectoptions
("ssl_key=client-key.pem;ssl_cert=client-cert.pem;ssl_ca=ca-cert.pem;client_ignore_space=1");
// use an ssl connection to the serverif(
!db.
open()
)...
// postgresql connection
db.setconnectoptions
("requiressl=1");
// enable postgresql ssl connectionsif(
!db.
open()
)...
// odbc connection
db.setconnectoptions
("sql_attr_access_mode=sql_mode_read_only;sql_attr_trace=sql_opt_trace_on");
// set odbc optionsif(
!db.
open()
)
總結:
實際應用中,並不是讓資料庫去直面大併發讀寫,會借助「外力」,比如快取、利用主從庫實現讀寫分離、分表、使用佇列寫入等方法來降低併發讀寫。特別是對於sqlite來說,相較於mysql等資料庫畢竟缺乏了許多功能(例如樂觀鎖、悲觀鎖),所以更多還是要在應用層上下功夫來處理併發。
SQLite的併發處理
使用sqlite經常會遇到併發處理,要處理好多執行緒或多程序之間的併發,就得搞清楚sqlite的機制,尤其是sqlite的鎖機制。因為sqlite是檔案資料庫,所以它的鎖也基本是和檔案一致,也即 寫獨佔,讀共享。這意味是在讀取資料庫的時候,是可以多個執行緒共享的,而如果有增刪改的操作,則會獨佔此檔案...
cocoa併發訪問Sqlite中的死鎖問題
在實際開發過程中,如果涉及到資料庫的頻繁寫入,更新等操作,在加上連續事件的有序操作,死鎖的問題就可能發生 廢話不多說了 開發中使用最多sqlite三方庫是fmdb,最新版本的fmdb為了支援併發,加入了fmdatabasequeue,其原理就是對乙個databse的訪問,通過內部的乙個serialq...
Qt中操作SQLite資料庫
sqlite是一款開源 輕量級 跨平台的資料庫,無需server,無需安裝和管理配置。它的設計目標是嵌入式的,所以很適合小型應用,也是qt應用開發種常用的一種資料庫。目錄1.驅動 2.初相遇 3.建立表 4.執行增刪改查 5.高階 6.工具 7.參考 qt sql模組使用驅動程式外掛程式 plugi...