문제

Oracle 9 DB에서 아래의 SQL 명령을 실행할 때 "ENQ : TX -ROW LOCK POTENTION"으로 계속 실행됩니다. 테이블 MyTable은 300 줄 미만의 작은 테이블입니다.

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

나는 동시에 10 개의 스레드를 실행하고 일부는 업데이트 할 기회를 얻기 위해 10 초 정도 기다립니다. 나는이 교착 상태 문제에 직면 할 것이라는 것을 알고 있지만, 나에게 문제는 테이블이 작기 때문에 훨씬 더 빠를 수 있어야한다는 것입니다. 따라서 업데이트하는 것이 빠릅니다.

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

Rowlock 대기열의 속도를 향상시키기 위해 무엇을 할 수 있습니까? 내 스레드가 더 빨리 실행되도록이 대기 시간을 어떻게 개선 할 수 있습니까?

도움이 되었습니까?

해결책

차단되고 싶지 않다면 맹목적으로 업데이트하지 마십시오.. Update Nowait에 대한 선택을 먼저 수행하십시오. 예외를 제기하면 (ORA-00054) 이는 다른 세션이 현재 해당 행과 함께 작동하고 있음을 의미합니다. 이 경우 요구 사항에 따라 다른 행을 업데이트하려고 시도 할 수 있습니다 (대기열/디케이드 프로세스를 구축하려고합니까?), 대기 (DBMS_LOCK.SLEEP) 또는 오류 메시지를 호출 앱에 반환하십시오.

당신은 할 것입니다 절대 Update Nowait을 위해 행을 잠그면 교착 상태에 직면하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top