Q&A

  • db의 상태체크
LAN으로 파라독스db를 공유하고 있습니다.

한대의 컴이 공유된 db를 건드렸을 때 Lock이 걸리는 것으로 알고 있습니다. 이럴 때

db의 상태를 체크하고 싶은데요. TDataSet의 State속성을 써야 되는지, 아니면 CanModify란 속성도 있던데. 과연 어떤 방법으로 체크를 해야 정확할까요.그리고

Lock이 걸리면 db에 데이타를 쓸 수 없는데 어떤 식으로 처리해야 여러대가 원하는 때에 db에 저장을 할 수 있을까요?

1  COMMENTS
  • Profile
    김영대 1999.11.27 00:33
    박성훈 wrote:

    > LAN으로 파라독스db를 공유하고 있습니다.

    > 한대의 컴이 공유된 db를 건드렸을 때 Lock이 걸리는 것으로 알고 있습니다. 이럴 때

    > db의 상태를 체크하고 싶은데요. TDataSet의 State속성을 써야 되는지, 아니면 CanModify란 속성도 있던데. 과연 어떤 방법으로 체크를 해야 정확할까요.그리고

    > Lock이 걸리면 db에 데이타를 쓸 수 없는데 어떤 식으로 처리해야 여러대가 원하는 때에 db에 저장을 할 수 있을까요?



    "Search the Borland Web Site"

    http://www.borland.com/searchsite/

    에서 "record lock" 으로 검색해 보시면 참고가 되실겁니다



    function fDbiIsRecordLocked(Table: TTable): Boolean;

    var

    Locked: BOOL;

    hCur: hDBICur;

    rslt: DBIResult;

    ByAnyone: boolean;

    begin

    Table.UpdateCursorPos;

    // Is the record locked by the current session...

    Check(DbiIsRecordLocked(Table.Handle, Locked));

    Result := Locked;

    // If the current session does not have a lock and the ByAnyone varable is

    // set to check all sessions, continue check...



    { Always do this, so works with all current calls. }

    ByAnyone := True;



    if (Result = False) and (ByAnyone = True) then

    begin

    // Get a new cursor to the same record...

    Check(DbiCloneCursor(Table.Handle, False, False, hCur));

    try

    // Try and get the record with a write lock...

    rslt := DbiGetRecord(hCur, dbiWRITELOCK, nil, nil);

    if rslt <> DBIERR_NONE then

    begin

    // if an error occured and it is a lock error, return true...

    if HiByte(rslt) = ERRCAT_LOCKCONFLICT then

    Result := True

    else

    // If some other error happened, throw an exception...

    Check(rslt);

    end

    else

    // Release the lock in this session if the function was successful...

    Check(DbiRelRecordLock(hCur, False));

    finally

    // Close the cloned cursor...

    Check(DbiCloseCursor(hCur));

    end;

    end;

    end;