其實,我找到了一種方法通過構建的哈克鎖類型來模擬單個用戶的讀寫訪問。以下將描述我是如何實現它的。
因此,我在訪問中創建了一個小表,名爲Lock
,並且有一列名爲SomeValue
。這個列必須是一個主鍵,並且可以是任何值,所以我把它作爲類型編號。該表將存儲所有將在其中創建的鎖,並且試圖獲取該鎖的兩側必須同意該鎖的值。例如,兩個客戶端將嘗試獲取值爲1的鎖,因此他們應該請求鎖1,並釋放鎖1。
首先,這裏是我做了設置和解除鎖定,通過將鎖定值的雙方試圖獲取它的兩個輔助查詢:
SetLock查詢:
INSERT INTO Lock (SomeValue)
VALUES ([GetLockValue]);
RELEASELOCK查詢:
DELETE *
FROM Lock
WHERE SomeValue=[GetLockValue];
然後,這裏是TrySetLock功能(這將嘗試設置的值傳遞的鎖,並返回結果集,其中1是一通,0是一個發IL)和SetLock子(這會等到由價值傳遞是空的,以獲取它的鎖 - 它使用鎖定取得自旋鎖法):
Public Function TrySetLock(LockValue As Integer) As Integer
Dim dbs As dao.Database
Dim qdf As dao.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("SetLock")
qdf.Parameters("GetLockValue").Value = LockValue
qdf.Execute
TrySetLock = qdf.RecordsAffected
End Function
Public Sub SetLock(LockValue As Integer)
Do While TrySetLock(LockValue) = 0
Loop
End Sub
這裏是RELEASELOCK子(這將釋放在價值傳遞的鎖 - 此分將始終成功,即使沒有這樣的鎖存在):
Public Sub ReleaseLock(LockValue As Integer)
Dim dbs As dao.Database
Dim qdf As dao.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("ReleaseLock")
qdf.Parameters("GetLockValue").Value = LockValue
qdf.Execute
End Sub
正如你可以看到這裏,我已經使用SQL和微軟的主鍵屬性的幫助訪問表以確保插入(或通過鎖定引用)只能一次成功執行某一方或客戶端,並且不會成功執行另一方,除非第一面刪除(或釋放)鎖定雙方同意的鎖定值。
但是,如果一個客戶端未能釋放鎖(例如客戶端程序被凍結,並且不得不強制終止程序),則會阻塞所有依賴同一鎖的客戶端。我想知道當一個程序被迫被殺死或者不會被調用時,類模塊的析構函數是否會被調用?如果它被調用,那麼我認爲通過創建具有某個值的鎖類可以解決此問題,並且該類的釋放器將釋放該鎖,而不必讓其他客戶端等待該特定的鎖。
這是你想要的開始http://stackoverflow.com/questions/5792169/opening-access-database-in-exclusive-mode#answer-5792773 –