2014-09-05 159 views
0

我有一個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包裝。

+0

有沒有這樣的事情作爲「訪問鎖」; SQLite只有一個數據庫鎖。 – 2014-09-06 08:08:17

+0

對不起,我的壞詞彙。似乎在我的研究中,SQLite使用頁面鎖定進行內部同步。可以記錄,但對這個問題無關緊要。然後在執行Begin事務時出現鎖定。然後是雜注鎖定模式。Begin事務的默認超時時間是5秒。我發現了一個可以改變這個問題的編譯指示,但是我對鎖定模式的超時時間更像3-4分鐘。那個我想要改變的人。 – penright 2014-09-08 11:34:16

+0

沒有頁面或記錄鎖; SQLite [總是使用數據庫鎖](http://www.sqlite.org/lockingv3.html)。 – 2014-09-08 11:41:44

回答

0

CL讓我走上了正軌。這是.NET命令的超時。這裏的代碼從我的課上設置它。

Dim con As DbConnection = OpenDb(DatabaseName, StoreNumber, ShareExclusive, ExtType) 
    Dim cmd As DbCommand = con.CreateCommand() 
    If _QueryTimeOut > -1 Then cmd.CommandTimeout = _QueryTimeOut 

不要掛斷變量,發佈代碼的目的是顯示我可以顯示我正在談論的屬性。默認的_QueryTimeOut被設置爲300(秒)。我將cmd.ComandTimeout設置爲1(秒),並按預期返回。

隨着CL終於找到我,超時正在其他地方發生。有時候需要一腳踢開箱子。 :-)