Oracle에서 레코드가 잠겨 있으면 어떤 레코드가 잠겨 있는지 알 수 있습니까?


10

레코드가 잠겨있을 때 어떤 레코드가 잠겨 있는지 알 수 있습니까?

레코드 rowid 또는 다른 정보를 얻으려면 어떻게해야합니까?


이 SQL로 정보를 얻을 수 있습니다.

SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
   FROM v$locked_object a, dba_objects b, v$session c    
WHERE a.object_id = b.object_id    
    AND a.SESSION_ID = c.sid(+) 

웹에서 함수를 사용하여 rowid를 얻는 방법을 찾았습니다. DBMS_ROWID.ROWID_CREATE()

그러나 작동하지 않는 것 같습니다.


2
트랜잭션이 보유한 잠금이 아닌 일부 프로세스가 대기중인 잠금 만 볼 수 있습니다.
a_horse_with_no_name

@a_horse_with_no_name-v $ lock은 거래에서 보유한 잠금을 보여줍니다
Chris Saxon

@ChrisSaxon : 맞습니다. 어떤 이 잠겨 있는지 알 수 없다는 사실을 언급하고 있었습니다. 더 명확해야합니다.
a_horse_with_no_name

다른 데이터베이스와 달리 Oracle에는 잠금에 대한 공유 구조가 없습니다. 이렇게하면 데이터베이스를 확장 할 수 있지만 반면에 모든 잠금을 볼 수는 없습니다. 잠금은 데이터베이스 블록에 직접 저장됩니다. 누군가가 막히는 순간 "홀더 웨이터"구조가 만들어집니다. 그러면이 쌍이에 표시 V$LOCK됩니다.
ibre5041

답변:


13

세션에 의해 잠겨있는 모든 행을 실제로 나열 할 수는 없습니다 . 그러나 세션이 다른 세션에 의해 차단 되면 세션을 차단 하고있는 세션 / 행을 찾을 수 있습니다.

오라클은 개별 행 잠금 목록을 유지 관리하지 않습니다. 오히려 잠금은 행 자체 내부에 직접 등록됩니다. 여분의 열로 생각하십시오.

V$LOCK뷰를 통해 객체에 대한 잠금을 획득 한 세션을 찾을 수 있지만 이것은 행 레벨이 아닌 일반 정보 만 나열합니다.

이보기를 사용하면 다른 세션에서 세션을 차단하고 있는지 확인할 수도 있습니다. 이 경우 다른 세션에서 세션을 차단 하면 V$SESSION정보 에 행 정보가 표시됩니다 .

rowid를 검색 할 수 있습니다. 2 개의 세션으로 예제를 작성해 보겠습니다.

SESSION1> create table test as select * from all_objects;

Table created

SESSION1> select rowid from test where object_name = 'TEST' for update;

ROWID
------------------
AAMnFEAAaAAALTDAAz

/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');

PL/SQL procedure successfully completed

SESSION2> select 1 from test where object_name = 'TEST' for update;
/*  this will block */

세션 2는 지금 우리가 발견 할 수있는 세션 1에서 기다리고 차단 과 행 :

SESSION1> SELECT o.object_name,
       2         dbms_rowid.ROWID_CREATE (1,
       3                                  s.ROW_WAIT_OBJ#,
       4                                  s.ROW_WAIT_FILE#,
       5                                  s.ROW_WAIT_BLOCK#,
       6                                  s.ROW_WAIT_ROW#) rid
       7     FROM dba_objects o, v$session s
       8    WHERE o.object_id = s.row_wait_obj#
       9      AND s.client_info = '012345';

OBJECT_NAME     RID
--------------- ------------------
TEST            AAMnFEAAaAAALTDAAz

추가 정보 : Tom Kyte의 프로세스 설명 .


3

다음 쿼리를 실행하여 Oracle 데이터베이스에서 모든 테이블 잠금을 찾을 수 있습니다.

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.