問題:我有多個行程訪問同一個 SQLite 資料庫,所有行程都試圖更新同一個表中同一行中相同的 3 列。該UPDATE被保護的sqlite3_mutex(在UPDATE被括號sqlite3_mutex_enter和sqlite3_mutex_leave)。這不起作用,并且其中一項更新失敗并顯示“資料庫已鎖定”是很常見的。
更詳細地說,每個行程都是由 Apache 創建的,它回應來自客戶端的多個(大約十幾個)異步 Ajax 請求。每個請求首先記錄當前時間,用于會話管理,所以我得到 12 個行程都在“同一”時間UPDATE運行(日志都顯示它們在同一秒內運行,具有唯一的 PID,但我沒有檢查更精確的時間)。
資料庫sqlite3_open使用默認選項打開,因此被序列化。
那么,顯而易見的問題 - 為什么這不起作用?我不認為互斥鎖的使用是錯誤的,那么“忙”期是否可以超出互斥鎖的持有時間?我可以做的一件事是打開資料庫sqlite3_open_v2,然后更改為多執行緒而不是序列化(因為每個行程都有一個唯一的資料庫連接) - 這有幫助嗎?
我在下面添加了代碼的簡化版本。正在執行的陳述句是UPDATE users SET Limit1=%lx, Limit2=%lx, Limit3=%lx WHERE UserName='%s',其中的%欄位在運行時以類似 C 的方式填充。
謝謝。
// sqlite3 version 3.26.0, Linux
sqlite3_mutex *mutex = sqlite3_db_mutex(con);
assert(mutex);
sqlite3_mutex_enter(mutex);
rc = sqlite3_exec(con, statement, 0, 0, 0);
if(rc != SQLITE_OK)
... save error message from sqlite3_errmsg
else
... save the changed row count from sqlite3_changes
sqlite3_mutex_leave(mutex);
uj5u.com熱心網友回復:
294
在 Windows 中你可以試試這個程式http://www.nirsoft.net/utils/opened_files_view.html找出行程正在處理 db 檔案。嘗試關閉該程式以解鎖資料庫
在 Linux 和 macOS 中,您可以執行類似的操作,例如,如果您鎖定的檔案是 development.db:
$ fuser development.db
此命令將顯示鎖定檔案的行程:
> development.db: 5430
殺掉行程就好了...
kill -9 5430
...您的資料庫將被解鎖。
uj5u.com熱心網友回復:
您提到使用多個行程,并且正在使用專為“執行緒同步”而設計的SQLite 互斥鎖。
重要的是,在 Windows 上,它們是用臨界區實作的,而在 Unix 平臺上,它們是用 pthread 互斥鎖實作的,而沒有設定 PTHREAD_PROCESS_SHARED 標志。在這兩種情況下,它們只在一個行程的范圍內作業,每個行程都有自己的一組互斥體供 SQLite 使用。
如果要阻止多個行程訪問同一個資料庫,則需要使用自己命名的互斥鎖或其他行程間鎖定機制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/352002.html
下一篇:使用PHP更新SQLite資料庫
