2010-03-11 4 views
2

oracle 9 DB에서 아래의 SQL 명령을 실행할 때 "enq : TX - 행 잠금 경합"이 계속 실행됩니다. 테이블 mytable은 300 행 미만의 작은 테이블입니다.오라클 행 잠금 대기열 시간이 긴

UPDATE MYTABLE 
SET  col1 = col1 + :B3 , 
     col2 = SYSDATE 
WHERE :B2   = col3 
    AND :B1  = col4 

동시에 10 개의 스레드를 실행하고 일부는 10 초 동안 업데이트하여 업데이트 할 수 있습니다. 나는이 교착 상태 문제에 직면하게 될 것이라는 것을 안다.하지만 나를위한 문제는 테이블이 작기 때문에 훨씬 빨라야한다는 것이다. 그래서 테이블을 업데이트하는 것이 빠를 것이다.

편집 :이 코드는 변경할 수 없으며 타사 응용 프로그램 내에 있습니다. 나는 단지 DB를 조정할 수 있습니다.

행 잠금 대기열의 속도를 향상 시키려면 어떻게해야합니까? 내 스레드가 더 빨리 실행될 수 있도록 대기 시간을 어떻게 향상시킬 수 있습니까?

+0

업데이트가 일반적으로 몇 행에 영향을 줍니까? –

+0

각 업데이트는 하나의 행에만 영향을줍니다. 하지만 여러 번 같은 열을 업데이트하려고하는 10 개의 스레드가 있습니다. – kurast

답변

2

차단하고 싶지 않으면 맹목적으로 업데이트하지 마십시오.. 먼저 SELECT FOR UPDATE NOWAIT를 수행하십시오. 예외 (ORA-00054)를 발생 시키면 다른 세션이 현재 해당 행으로 작업 중임을 의미합니다. 이 경우, 요구 사항에 따라 다른 행을 업데이트하려고 시도 할 수 있습니다 (대기열/대기열 제거 프로세스를 작성하려고합니까?), 대기 (dbms_lock.sleep)하거나 호출하는 응용 프로그램에 오류 메시지를 리턴하십시오.

은 FOR UPDATE NOWAIT으로 행을 잠그면 교착 상태가됩니다.

+0

말하는 것을 잊었지만 코드를 변경할 수 없습니다. 지금 나는 나의 질문을 편집했다 – kurast

+1

@ kurast : 업데이트 자체는 아마도 많은 시간을 들이지 않는다. ** 다른 세션 **이 커밋/롤백을 기다리는 데 소요되는 시간입니다. 이러한 스레드가 백그라운드 일괄 처리 작업 일 경우 어쩌면 경쟁이 예상되거나 유해하지 않을 수 있습니다. 액티브 포 그라운드 세션 인 경우 왜 같은 행을 업데이트하려고합니까? –