728x90
반응형
oracle에서 object가 lock이 걸렸을 떄 조회하는 sql문을 알아보자.
우선 lock에 걸리는 이유에 대해 간단하게 알아보겠습니다.
DB에 A라는 사용자가 연결되었고, 동시에 B라는 사용자도 연결했습니다.
A라는 사용자는 'test_a' 라는 테이블에 데이터를 삭제하는 delete문을 삭제하고 commit을 하지 않았습니다. 즉 DB에 반영이 되지 않았죠
그 상태에서 B사용자가 'test_a'라는 테이블에 데이터를 update를 했을 경우 B사용자는 A사용자가 DB에 작업을 반영할 때 까지 기다리는 일이 발생합니다.
이때 A가 'test_a'라는 테이블의 row resource를 사용하기위해 row lock을 걸었습니다.
이것을 그림으로 보면 아래와 같습니다.
이것은 매우 간단한 경우고 수많은 session이 얽혀 있는 DB에서 lock을 파악하기란 쉽지 않습니다.
우선 이 간단한 경우를 예시로 어떤 사용자가 lock을 잡고있는 사용자이고,
어떤 사용자가 대기를 하는 사용자인지 확인해보는 sql문을 작성해봅니다.
SELECT
CASE
WHEN a.xidusn = 0 AND a.xidslot = 0 AND a.xidsqn = 0 THEN
'waiting session'
ELSE
'locking table'
END AS lock_status,
d.sid,
d."SERIAL#",
a.OS_USER_NAME ,
d.username,
c.OBJECT_name,
c.object_type,
b.ctime,
a.process
FROM v$locked_object a , v$lock b, dba_objects c, v$session d
WHERE a.object_id = b.id1
AND a.SESSION_ID = b.sid
AND a.object_id = c.object_id
AND a.session_id = d.sid
and c.object_type = 'TABLE'
AND b.TYPE = 'TM';
위와 같이 사용할 수 있으며 결과는 아래처럼 나옵니다.
v$locked_object에서 xidusn, xidslot, xidsqn 이 0인 값을 가진 session은 트랜잭션을 시작하지 않았기 때문에 waiting 사용자인것을 확인 할수 있습니다.
그리고 ctime은 현재 session이 몇초정도 지났는지를 알 수 있습니다.
728x90
반응형
'DB (데이터베이스) > Oracle (오라클)' 카테고리의 다른 글
[Oracle] oracle PLS-00201 : identifier must be declared 원인, 해결 (0) | 2024.05.27 |
---|---|
[Oracle] oracle error Warning : too many parse errors 원인, 해결 (0) | 2024.05.27 |
[Oracle] oracle datafile rename방법 (0) | 2024.05.10 |
[Oracle] oracle 실행계획 조회방법 (0) | 2024.05.10 |
[Oracle] ORA-24247 네트워크 엑세스가 ACL(엑세스 제어 목록)에 의해 거부되었습니다. (0) | 2024.05.03 |