2010-06-11 5 views
0

with do transaction, 나는 라벨을 정의했으며이 라벨에서 exclusive-lock.and 테이블에 액세스하고 있습니다. 라벨의 끝에는 해당 테이블의 모든 변경이 완료되었습니다. BT는 이제 거래 블록에 있습니다. 이제 다른 세션에서 동일한 테이블에 액세스하려고 시도했습니다. 그러면 다른 사용자가 사용하는 테이블 오류가 표시됩니다. 그래서 우리는 거래에서 테이블을 공개 할 수있게되어 다른 사용자가 액세스 할 수 있습니다. 예를 들어거래 및 잠금 문제

:

세션 1)

DO TRANSACTION: 
    --- 
    --- 
    loopb: 
    REPEAT: 
    -- 
    -- 
    ---------------------> control is here right now. 
    END. /*repeat*/ 
    -- 
    -- 
END. /*do transaction*/ 

세션 2)

제가 동일한 테이블을 액세스하려고 시도하지만, 오류 표시, 다른 잠근 그 테이블 사용자.

답변

4

EXCLUSIVE-LOCK을 사용하여 루프에서 만진 모든 레코드는 TRANSACTION이 완료 될 때까지 다른 사용자가 잠글 수 없습니다. 이 문제를 해결할 수있는 방법은 없습니다. 두 번째 프로세스가 해당 레코드를 잠글 필요가 있다면 첫 번째 프로세스에서 TRANSACTION 범위를 줄이는 것입니다. 이는 안전 기능이므로 TRANSACTION, 모두에서 오류가 발생하면 TRANSACTION에서 변경 한 내용이 롤백됩니다. 또 다른 방법은 TRANSACTION 동안 레코드 잠금을 해제 할 수 있다면 TRANSACTION의 정의의 일부인 원 자성 (전체 또는 무효)을 잃을 수 있다는 것입니다.

두 번째 프로세스에서 해당 레코드를 잠글 필요가 없지만 업데이트 된 값만 표시하면됩니다. 업데이트 된 레코드가 더 이상 레코드 버퍼에 없거나 레코드 잠금 상태가 TRANSACTIONNO-LOCK으로 다운 그레이드되면 림보 잠금이되고 NO-LOCK을 사용하여 업데이트 된 값을 볼 수 있습니다. 망각 잠금 장치가 루프에서 마지막 레코드를 만들려면,이

FIND CURRENT tablerecord NO-LOCK. 

을 할 수 있습니다 또는 당신은에 액세스 할 필요가없는 경우이 레코드가 더 이상 버퍼 :

RELEASE tablerecord. 
+0

감사합니다. 아베이지만 세션 1의 세션 2에서 동일한 레코드를 업데이트하고 싶습니다.하지만 트랜잭션 크기를 줄이거 나 할 수 없습니다. 왜냐하면 트랜잭션이 anothe 조건에 영향을 줄 수 있기 때문입니다. 두 번째 세션에서 내 기록. – jay

+0

Jay, 두 번째 세션에서 레코드를 업데이트하려면 레코드에 EXCLUSIVE-LOCK이 필요합니다.이 레코드는 첫 번째 세션에서 보유 중이며 TRANSACTION이 끝날 때까지 해제되지 않습니다. 당신이하려는 일을 성취 할 수있는 유일한 방법은 1) 내 대답에 언급 된대로 TRANSACTION 범위를 좁히거나 2) 세션 1에서 레코드 잠금 코드를 취하여 외부 세션에서 업데이트를 수행하는 것입니다. 상태없는 AppServer 호출을 사용합니다. –

+0

아베, 트랜잭션 범위 bcz를 좁힐 수 있습니다. 많은 변경이 필요합니다. 나는 두 번째 옵션이 좋다라고 생각합니다.이 두 번째 시도 할 것입니다.하지만 두 번째 세션 레코드를 업데이트하기 위해 외부 프로 시저 (AppServer 호출 없음)를 사용하려고했습니다. 테이블은 잠겨 있습니다. – jay

3

기타 세션을 NO-LOCK을 사용하여 레코드의 "더티 읽기"를 수행하십시오. 그러나 트랜잭션이 커밋 (또는 롤백) 될 때까지는 트랜잭션을 잠 그거나 업데이트 할 수 없습니다. 그리고 반복 블록이 반복되거나 당신이 그것을 떠날 때까지 그런 일은 일어나지 않을 것입니다.