Oracle Row Locks의 긴 대기열 시간
-
19-09-2019 - |
문제
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을 위해 행을 잠그면 교착 상태에 직면하십시오.
제휴하지 않습니다 StackOverflow