2014-12-17 6 views
0
REPEAT With FRAME: 

    prompt-for IN-SCAN3.scan. 
    if input IN-SCAN3.scan="" then Do: 
    Message "please input date.". 
    undo,retry. 
    end. 
    else DO: 
    FIND FIRST in-scan3 USING IN-SCAN3.scan NO-LOCK NO-WAIT NO-ERROR. 
    if avail In-scan3 then DO: 
     str="OK". 
     display str. 
     next-prompt IN-SCAN3.scan. 
    end. 
    else DO:  
     CREATE In-scan3. 
     ASSIGN IN-scan3.scan=INPUT in-scan3.scan. 

     str="NO". DISPLAY str. 
     next-prompt In-scan3.scan. 
    END. 
    end. 
    begin=begin + 1. 
end. 

질문 내림차순으로 : 첫번째 입력 데이터를 찾을 동시에 스캔을 사용하여 20 명의 사용자가있다, 발견되지 않는 경우는, 다음 데이터베이스에서 하나 개의 레코드를 만들 수 있습니다. 질문은, 동시에 운영은 dead lock으로 보일 것입니다. 레코드를 찾을 때 NO-LOCK NO-WAIT를 시도합니다. 레코드를 생성 할 때 작동이 dead lock으로 표시됩니다.동시 작업이 진행 4GL

덕분에 어떤 대답.

+0

난 당신이 교착 상태를 방지하기 위해 배타적 LOCK 대신 NO-LOCK을 사용한다고 생각합니다. 그런 다음 LOCKED 함수를 사용하여 레코드가 잠겨 있는지 여부를 확인하고 적절한 작업을 수행 할 수 있습니다. – Austin

답변

0

불행히도 ABL의 기본 "잡았다"의 파울이 있습니다 - 레코드 잠금은 다른 방법으로 지정하더라도 쉐어 록으로 기본 설정됩니다. 이것은 아마도 원하는 것이 아닙니다.

기본 규칙은 트랜잭션 범위가 레코드 범위보다 작은 경우 트랜잭션을 종료 할 때 레코드가 SHARE-LOCK으로 다시 드롭된다는 것입니다. 그러나 ABL 가이드에서 관련 장을 읽으시기 바랍니다.

는이 문제를 해결하는 방법은 여러 가지가 있습니다. RELEASE 키워드는 하나입니다. 하지만 실제로 레코드를 잠그기 위해서는 별도의 버퍼를 사용해야한다는 생각이 들기 쉽습니다. 그렇게하면 다른 프로그래머에게도 명확하게 알릴 수 있습니다. 예를 들어

:

def buffer b-in-scan3 for in-scan3. 

repeat: 
    prompt-for in-scan3.scan. 

    /*** etc. ***/ 

    else 
    do for b-in-scan3 transaction: 
     find first b-in-scan3 using in-scan3.scan 
      exclusive no-wait no-error. 

     if not avail b-in-scan3 
     and not locked b-in-scan3 
     then 
     do: 
      create b-in-scan3. 
      b-in-scan3.scan = input in-scan3.scan. 
     end. 

    end. /* of transaction */ 

end. /* of repeat */ 

다른 프로그래머가 트랜잭션 블록 외부에서 B-inscan3를 사용하는 경우이 방법으로, 프로그램은 컴파일보다는 공유 잠금을 다시 놓기 시작되지 않습니다.

LOCKED와 AVAILABLE을 확인할 수 있지만 레코드가 잠긴 경우 사용할 수 없음을 기억하십시오.