2014-10-01 2 views
1

메시지 상자에 현재 버퍼의 잠금 유형을 표시하는 방법이 있는지 묻고 싶습니다. 이것을 할 수있는 방법이 있습니까?진행 4GL 디스플레이 버퍼 잠금 유형

런타임에 내 버퍼에있는 잠금 유형을 확인하고 싶습니다. 예를 들어

: MESSAGE STRING(myBuffer:LOCK-TYPE).
출력 : 직접 NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK

답변

1

하지 않습니다.

LOCKED (bufferName) 함수 (또는 버퍼 핸들 객체의 관련 속성)를 사용하여 잠겨 있는지 여부를 확인할 수 있지만 SHARE와 EXCLUSIVE를 구분할 수는 없습니다.

정말로 충분해야합니다. 잠겨있지 않으면 다른 사람에게 문제가되지 않습니다. 공유 또는 독점에 관계없이 잠긴 경우 다른 사람이 잠글 수 없습니다. 처음 독점 금지를 요청한 경우 즐기는 것은 귀하의 것입니다. 잠금 유형을 지정하지 못했거나 명시 적으로 SHARE-LOCK을 말한 후 이제 잠금을 업그레이드하려면 FIND CURRENT 테이블 EXCLUSIVE-LOCK을 사용해야합니다. 당신이 독점적 인 자물쇠가있는 향상을 얻는 경우에. 그렇지 않은 경우 NO-LOCK 또는 SHARE-LOCK (이전 테스트에서 알 수 있습니다)이었습니다. 이론적으로

당신이 거기에 정보를 _LOCK의 VST를 스캔하고 분석 할 수있을하지만 그것은이다 "그냥"이라는 단어에 명시된 요구 사항 :

을 만날 수있는 간단한 함수에서 긴 방법입니다 또한 매우 위험합니다. _LOCK VST는 휘발성이며 (항목을 읽고 읽을 수있는 것보다 빠르며 빠르게 진행됩니다.) 개발 환경에서 작동하는 것으로 보이는 코드를 작성하는 것은 매우 쉽지만 프로덕션 상황에서 방대한 양의 CPU 시간을 절약합니다. 그것을 시도하지 마십시오. 그것은 잘 끝나지 않을 것입니다.

당신이 날과 같이 생성 된 스냅 샷에서 적어도 일을 무시하고 주장하는 경우 :

define variable i as integer no-undo. 

define temp-table tt_lock no-undo like _lock 
    index id-idx is unique primary _lock-id 
    index recid-idx _lock-recid 
    index usr-idx _lock-usr 
    index tbl-idx _lock-table 
. 

empty temp-table tt_lock. 

for each _lock while _lock._lock-usr <> ?: 

    i = i + 1. 
    if i > 10000 then leave. 

    create tt_lock. 
    buffer-copy _lock to tt_lock no-error. 

end. 

주 각의에서 WHILE의 사용. 당신이 나를 무시하고이 접근법을 시도한다면 나는 실험 할 것을 강력히 권합니다. WHILE은 WHERE 기준으로 할 수있는 것보다 훨씬 빠릅니다.

"if i> 10000 then leave" 주지사 다. _LOCK을 수행하는 모든 코드에서 비슷한 것이 있어야합니다. 대형 잠금 테이블이있는 PROD 시스템에서 우발적 인 문제가 발생하는 것을 방지합니다.

아무리 많이하고 싶어도 실수를 저 지르고 있습니다. 제발 가지마. 문제를 이해하고 싶거나 개발자 환경의 문제를보고 싶지만 이러한 종류의 코드를 생산에 사용하지 마십시오.

+0

docs : LOCKED()는 이전 FIND에서 레코드를 사용할 수없는 경우 TRUE 값을 반환합니다. . . * 다른 사용자 *가 레코드를 잠 갔기 때문에 NO-WAIT 문 예를 들어 sports2000 db에서 다음 코드를 시도하고 응답으로 "no"를 받았습니다. 첫 번째 고객 전용 잠금 장치를 찾으십시오. 메시지 잠김 (고객)보기 - 경고 상자. 이것은 현재 프로그램이나 세션에 어딘가에 잠긴 레코드가 있는지 확인하기 위해 일반 검사로 사용할 수 없음을 의미합니다. FIND EXCLUSIVE-LOCK NO-WAIT 후에 사용할 수 있습니다. 그게 효과가 있는지보기 위해서. –

+0

누군가 다른 사람이 잠근 경우에는 그렇지 않습니다. 다른 사람이 아니라면 ... –