을 나는 방법에 발견 구성된 해킹 잠금 유형을 통해 읽기 및 쓰기를위한 단일 사용자 액세스를 시뮬레이트합니다. 다음은 어떻게 달성했는지 설명합니다.
예를 들어 Lock
이라는 작은 테이블에 액세스하고 SomeValue
이라는 열이 있습니다. 이 열은 기본 키이어야하며 어떤 값일 수도 있으므로 예를 들어 유형 번호로 만들었습니다. 이 테이블은 그 안에 만들어 질 모든 자물쇠를 저장하고, 자물쇠를 얻으려는 쪽은 자물쇠 값에 대해 동의해야합니다. 예를 들어 두 클라이언트는 값 1의 잠금을 획득하려고 시도하므로 잠금 1을 요청하고 잠금 1을 해제해야합니다.
SetLock 쿼리 :
INSERT INTO Lock (SomeValue)
VALUES ([GetLockValue]);
ReleaseLock을
첫째, 여기에 내가 설정하고 잠금의를 취득하려고 측면을 값을 전달하여 잠금을 해제하기 위해 만든 두 도우미 쿼리는 질의 : 다음
DELETE *
FROM Lock
WHERE SomeValue=[GetLockValue];
, 여기에 1 패스이고, 설정 결과 값 전달의 잠금을 설정하고 반환하려고 할 것 TrySetLock 기능 (이며, 0은 FA입니다 - 값 전달 된 그것을 획득 비어에 의해 잠금 될 때까지 대기 위원장)과 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 및 Microsoft의 기본 키 속성의 도움을 사용했다 테이블에 액세스하여 삽입 (또는 여기에서 잠금으로 참조)은 한 번에 한쪽 또는 클라이언트에서만 성공할 수 있으며 다른 쪽에서는 성공하지 못합니다. 첫 번째 측면은 양측이 동의하는 동일한 값의 잠금을 제거 (또는 해제)합니다.
그러나 이것은 하나의 클라이언트가 잠금을 해제하지 못하면 (예를 들어 클라이언트의 프로그램이 고정되어있어 강제로 프로그램을 강제 종료해야하는 경우) 동일한 잠금을 사용하는 모든 클라이언트를 차단하는 문제를 일으 킵니다. 프로그램이 강제 종료 될 때 Class 모듈의 소멸자가 호출되는지 여부를 알고 싶습니다. 그것이 호출되면, 나는이 문제가 어떤 값을 가진 잠금 클래스를 만들어서 고쳐질 수 있다고 생각한다. 그리고 그 클래스의 destuctor는 잠금을 해제하고 다른 클라이언트가 그 특정 잠금을 기다릴 필요가 없다.
이것은 원하는 것의 시작입니다. http://stackoverflow.com/questions/5792169/opening-access-database-in-exclusive-mode#answer-5792773 –