오라클 추적 파일에서 교착 상태 오류의 원인 찾기
여러 사용자가 응용프로그램을 사용할 때 응용프로그램에서 "ora-00060 교착 상태가 리소스 대기 중에 감지됨" 오류가 자주 발생합니다.오라클 관리자로부터 추적 파일을 얻었지만, 읽을 때 도움이 필요합니다.아래는 추적 파일의 데이터이며, 원인을 찾는 데 도움이 될 것으로 기대합니다.
*** 2013-06-25 09:37:35.324
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a deadlock due
to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
session 72: DID 0001-00D2-000000C6 session 24: DID 0001-00D0-00000043
session 24: DID 0001-00D0-00000043 session 72: DID 0001-00D2-000000C6
Rows waited on:
Session 72: no row
Session 24: no row
----- Information for the OTHER waiting sessions -----
Session 24:
sid: 24 ser: 45245 audsid: 31660323 user: 90/USER
flags: (0x45) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x40009) -/-/INC
pid: 208 O/S info: user: zgrid, term: UNKNOWN, ospid: 2439
image: oracle@xyz.local
client details:
O/S info: user: , term: , ospid: 1234
machine: xyz.local program:
current SQL:
delete from EMPLOYEE where EMP_ID=:1
----- End of information for the OTHER waiting sessions -----
Information for THIS session:
----- Current SQL Statement for this session (sql_id=dyfg1wd8xa9qt) -----
delete from EMPLOYEE where EMP_ID=:1
===================================================
"데드록 그래프:라고 말하고 있습니다.또한 섹션에서 대기 중인 행은 행이 없음으로 표시됩니다.
저는 또한 몇몇 블로그에서 추적 파일의 "sqltxt" 섹션이 원인을 제시할 수 있다는 것을 읽었습니다.아래는 해당 섹션에 표시된 쿼리입니다.
select /*+ all_rows */ count(1) from "USERS"."EMPLOYEE_SALARY" where EMPSAL_EMP_ID=:1
employee_salary 테이블에는 EMPSAL_EMP_ID 열에 외부 키 제약 조건이 있습니다.
sql 힌트에 "all_rows"라고 표시되는데, 직원 테이블에서 레코드를 삭제할 때 이 테이블이 테이블 레벨 잠금을 받는다는 뜻입니까?저는 현재 외부 키 열에 색인이 없습니다.이 열에 인덱스를 추가하는 것이 도움이 됩니까?
더 필요한 정보가 있을 경우 게시해 주시기 바랍니다.
감사해요.
일단은.select
문은 Oracle에서 어떤 것도 잠그지 않으며 사용 가능한 마지막 일관된 버전의 데이터만 사용합니다.을 위한 경우가 아닙니다.select ... for update
다음과 같이 데이터를 잠급니다.update
오라클 9i 이후, 하지만 없습니다.for update
질문의 쿼리에 절이 있습니다.
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
세션 #72는 "Row Exclusive" 유형(SX)이 있는 테이블 수준 잠금(TM)을 보유하고 있으며 동일한 테이블에서 "Share Row Exclusive"(SSX) 잠금을 획득하려고 합니다.이 세션은 이미 동일한 유형의 테이블 수준 잠금(SX)을 보유하고 있으며 SSX 잠금이 사용 가능할 때까지 대기하는 세션 #24에 의해 차단되었습니다.
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
이(두 번째 행)는 정확히 같은 상황을 보여주지만 반대 방향입니다.세션 #24는 SSX 잠금이 사용 가능해질 때까지 대기하지만 동일한 테이블에 이미 SX 잠금을 보유하고 있는 세션 #72에 의해 차단됩니다.
세션 #24와 세션 #72는 서로를 차단합니다. 교착 상태가 발생합니다.
두 잠금 유형(SX 및 SSX)은 모두 테이블 레벨 잠금입니다.
상황을 이해하기 위해서 저는 프랭크 파초의 이 기사를 읽는 것을 추천합니다.
다음은 귀하의 상황과 직접적으로 관련이 있는 이 기사의 인용문입니다(SSX와 SRX의 약어는 동일합니다).
참조 무결성은 TM 잠금도 획득합니다.예를 들어 인덱스되지 않은 외부 키와 관련된 일반적인 문제는 상위 테이블에서 키를 삭제하거나 업데이트할 때 하위 테이블에 잠금이 발생합니다.인덱스가 없으면 Oracle에는 참조 무결성을 위반할 수 있는 동시 삽입을 방지하기 위해 잠글 하위 수준 리소스가 하나도 없기 때문입니다.
외부 키 열이 일반 인덱스의 선행 열인 경우 상위 값을 가진 첫 번째 인덱스 항목을 단일 리소스로 사용하고 행 수준 TX 잠금으로 잠글 수 있습니다.
그리고 만약 참조 무결성에 삭제 시 캐스케이드가 있다면 어떨까요?S 모드 외에도 Row X(RX) 모드와 마찬가지로 하위 테이블의 행을 업데이트합니다.여기서 공유 행 배타적(SRX)이 발생합니다. S+RX=SRX가 표시됩니다.
가장 이 높은 변수는 # # 서라가장높은변세형션 #72및에 #24서다것일의 입니다.EMPLOYEE
에 표가 , 테블동시에그, 거에기고리이가 있습니다.on delete cascade
EMPSAL_EMP_ID
색인 것과함께에 색인이 하여.EMPLOYEE_SALARY
있는 EMPSAL_EMP_ID
열이 먼저 나열됩니다.
언급URL : https://stackoverflow.com/questions/17358088/finding-cause-of-deadlock-error-from-oracle-trace-file
'itsource' 카테고리의 다른 글
IPython 노트북에서 코드가 실행되는지 확인하려면 어떻게 해야 합니까? (0) | 2023.07.21 |
---|---|
매트플로트립에서 X축 레이블을 아래로 이동하지만 X축 눈금은 아래로 이동하지 않습니다. (0) | 2023.07.21 |
.gitignore 파일에 Django 마이그레이션 파일을 추가해야 합니까? (0) | 2023.07.16 |
장고의 CSRF 유효성 검사를 비활성화하는 방법은 무엇입니까? (0) | 2023.07.16 |
Oracle 데이터베이스에 대량 삽입:커서 루프와 단순 선택 중 어느 것이 더 좋습니까? (0) | 2023.07.16 |