我有一個SQLite數據庫,我想鎖定同步的目的。我不想要一個在另一個盒子上運行異步處理的進程,它處理從另一個盒子添加的數據,直到它完成更新。 DataAccess是一個類,它連接到sPackageFileName並重用相同的連接,只要sPackageFileName相同或除非調用.Close方法。所以基本上DataAccess.ExecCommand執行一個命令。 在谷歌我發現這.... ....控制超時鎖定獨佔SQLite3數據庫
DataAccess.ExecCommand("PRAGMA locking_mode = EXCLUSIVE", sPackageFileName)
DataAccess.ExecCommand("BEGIN EXCLUSIVE", sPackageFileName)
DataAccess.ExecCommand("COMMIT", sPackageFileName)
這工作作爲advertise。如果我在框A和框B上運行這個,我會得到一個「數據庫鎖定」異常。問題是需要多長時間。我發現了一個PRAGMA busy_timeout。這個PRAGMA超時控制訪問鎖定,而不是數據庫鎖定。我認爲沒有數據庫鎖定超時的PRAGMA。現在看來大概3-4分鐘。另一個注意事項是,sPackageFileName不在任何一個框中,它們(框A和框B)通過共享驅動器連接到它。 此外,我正在使用SQLite DLL的VB.NET包裝。
有沒有這樣的事情作爲「訪問鎖」; SQLite只有一個數據庫鎖。 – 2014-09-06 08:08:17
對不起,我的壞詞彙。似乎在我的研究中,SQLite使用頁面鎖定進行內部同步。可以記錄,但對這個問題無關緊要。然後在執行Begin事務時出現鎖定。然後是雜注鎖定模式。Begin事務的默認超時時間是5秒。我發現了一個可以改變這個問題的編譯指示,但是我對鎖定模式的超時時間更像3-4分鐘。那個我想要改變的人。 – penright 2014-09-08 11:34:16
沒有頁面或記錄鎖; SQLite [總是使用數據庫鎖](http://www.sqlite.org/lockingv3.html)。 – 2014-09-08 11:41:44