我有一個sqlite3數據庫可以被幾個線程(3-4)訪問。我知道sqlite3關於併發性的一般限制,如http://www.sqlite.org/faq.html#q6所述,但我相信這不是問題。sqlite3'數據庫被鎖定'不會因重試而消失
所有的線程都從這個數據庫讀取和寫入。每當我寫,我有以下結構:
try:
Cursor.execute(q, params)
Connection.commit()
except sqlite3.IntegrityError:
Notify
except sqlite3.OperationalError:
print sys.exc_info()
print("DATABASE LOCKED; sleeping for 3 seconds and trying again")
time.sleep(3)
Retry
在某些運行時,我甚至不會打這個塊,但是當我做,它永遠不會出來的它(保持重試,但我一直如果我正確理解讀寫器鎖的使用情況,一些等待可以幫助爭用,這聽起來像是死鎖,但我沒有在我的代碼中使用任何事務,並且每個SELECT或INSERT都只是一個關閉,但是某些線程在執行操作時會保持相同的連接(其中包括SELECTS和INSERTS以及其他修飾符的混合)
如果可以,我會修改它爲此遮光,還有修復它的方法(除了使用不同的數據庫引擎)。
你可以建立一個非常小的隔離測試用例來證明這個問題嗎?如果我們有可執行代碼並且可以看到整個事情,那會更容易。 – Dustin 2010-01-12 18:59:36
嗨達斯汀,這可能實際上證明很難,因爲即使有更大的代碼庫,我也很難再現它。我主要想知道這是否是一個常見問題,以及sqlite3中是否存在已知的死鎖問題。我會暫時發佈我不那麼優雅的修補程序。 – BME 2010-01-13 14:26:52