2011-07-01 4 views
1

동일한 트랜잭션 데이터베이스와 통신하는 2 대의 서버가 있다고 가정 해보십시오.트랜잭션 데이터베이스를 사용하여 중요한 섹션을 만들려면 어떻게해야합니까?

이 두 서버 중 하나만 주어진 시간 동작 (본질적으로 동기화를 시행하기 위해 데이터베이스 사용)을 수행하도록 설정하려고합니다. 내가 들었던 것으로부터이 라인을 따라 무언가가 작동 할 수도 있습니다.

내 테이블 TABLE에 ID와 STATUS라는 2 개의 열이 있습니다. 코드를 다음과 같이 설정하면 :

update TABLE set STATUS = 'processing' where ID = 1234 and STATUS != 'processing' 

if (weHaveModifiedAtLeastOneRow) 
{ 
    // do critical section stuff here 
    // This is code that we only want one server to run, not both. 

    update TABLE set STATUS = 'free' where ID = 1234 
} 
else 
{ 
    // We failed to get the lock, so do nothing 
} 

여기에 몇 가지 개념이 없습니까?

답변

1

중요한 섹션을 원하면 dbms_lock.request을 사용하십시오. 당신은 의미있는 잠금 핸들 저점이 같은 독특한 할당받을 수있다 : 당신이 그것을 원하는 경우

DBMS_LOCK.ALLOCATE_UNIQUE (lockname => 'MYAPP_' || ID, lockhandle => handle); 
success := DBMS_LOCK.REQUEST(lockhandle => handle, timeout => 1); 
if (success = 0) then 
-- Do stuff 
DBMS_LOCK.release(handle); 
else 
-- we waited a second and didn't got the lock. 
end if; 

, 당신은 잠금 알려진 걸쳐 ID 값 공간을 프로젝트, ID를 통해 해시와 나머지 연산자를 적용 할 수있는, 관련없는 거래를 지연시킬 위험이 적습니다 (낮은).

+0

나는 우리 자신의 자물쇠를 굴리는 큰 팬이 아니다. 그러나 이것이 해결책 일 수있는 경우입니다. 그러나 잠금을 발행 할 때 두 호출 서버가 동일한 ID를 사용하는지 확인해야하므로 동기화 문제를 해결하는 대신 전송하는 것처럼 보입니다. – APC

관련 문제