SELECT T2.USERNAME
      ,T2.SID
      ,T2.SERIAL#
      ,T3.OBJECT_NAME
      ,T2.OSUSER
      ,T2.MACHINE
      ,T2.PROGRAM
      ,T2.LOGON_TIME
      ,T2.COMMAND
      ,T2.LOCKWAIT
      ,T2.SADDR
      ,T2.PADDR
      ,T2.TADDR
      ,T2.STATUS
      ,T2.SQL_ADDRESS
      ,T1.LOCKED_MODE
      ,T2.ACTION
  FROM V$LOCKED_OBJECT T1, V$SESSION T2, DBA_OBJECTS T3
 WHERE T1.SESSION_ID = T2.SID
   AND T1.OBJECT_ID = T3.OBJECT_ID
   AND T3.OBJECT_NAME LIKE 'AR%'
 ORDER BY T2.LOGON_TIME;

--KILL SESSION語法 ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
ALTER SYSTEM KILL SESSION '124,18258';
--ALTER SYSTEM KILL SESSION '259,1698';

--大家發現,上面這條SQL語句用到了ORACLE的兩個視圖和一個表,分別是V$LOCKED_OBJECT、V$SESSION、
--DBA_OBJECTS: V$LOCKED_OBJECT 視圖中記錄了所有SESSION中的所有被鎖定的對象信息。 V$SESSION 視圖
--記錄了所有SESSION的相關信息。 DBA_OBJECTS 為ORACLE用戶對象及系統對象的集合,通過關聯這張表能夠
--獲取被鎖定對象的詳細信息。
--V$LOCKED_OBJECT中的LOCKED_MODE字段表示鎖的模式,ORACLE中鎖的模式有如下幾種:

--0:NONE
--1:NULL 空
--2:ROW - S 行共享(RS) :共享表鎖,SUB SHARE
--3:ROW - X 行獨佔(RX) :用於行的修改,SUB EXCLUSIVE
--4:SHARE 共享鎖(S) :阻止其他DML操作,SHARE
--5:S / ROW - X 共享行獨佔(SRX) :阻止其他事務操作,SHARE / SUB EXCLUSIVE
--6:EXCLUSIVE 獨佔(X) :獨立訪問使用,EXCLUSIVE

--數字越大鎖級別越高, 影響的操作越多。

--1級鎖有:SELECT,有時會在V$LOCKED_OBJECT出現。

--2級鎖有:SELECT FOR UPDATE, LOCK FOR UPDATE, LOCK ROW SHARE
--SELECT FOR UPDATE當對話使用FOR UPDATE子串打開一個游標時,
--所有返回集中的數據行都將處於行級(ROW - X)獨佔式鎖定,
--其他對象只能查詢這些數據行,不能進行UPDATE、DELETE或SELECT FOR UPDATE操作。

--3級鎖有:INSERT、UPDATE、DELETE、LOCK ROW EXCLUSIVE
--沒有COMMIT之前插入同樣的一條記錄會沒有反應,因為後一個3的鎖會一直等待上一個3的鎖,
--我們必須釋放掉上一個才能繼續工作。   

--4級鎖有:CREATE INDEX、LOCK SHARE
--LOCKED_MODE為2,3,4不影響DML(INSERT, DELETE, UPDATE,SELECT) 操作,
--但DDL(ALTER, DROP等) 操作會提示ORA - 00054錯誤。 00054, 00000,
--"resource busy and acquire with NOWAIT specified"
--CAUSE :RESOURCE INTERESTED IS BUSY.
--ACTION :RETRY IF NECESSARY.

--5級鎖有:LOCK SHARE ROW EXCLUSIVE
--具體來講有主外鍵約束時UPDATE / DELETE .. .;可能會產生4, 5的鎖。

--6級鎖有:ALTER TABLE, DROP TABLE, DROP INDEX, TRUNCATE TABLE, LOCK EXCLUSIVE

--附上幾條簡單的ORACLE系統查詢語句:

--查某session 正在執行的sql語句,從而可以快速定位到哪些操作或者代碼導致事務一直進行沒有結束等.
SELECT /*+ ORDERED */
 SQL_TEXT
  FROM V$SQLTEXT A
 WHERE (A.HASH_VALUE, A.ADDRESS) IN
       (SELECT DECODE(SQL_HASH_VALUE, 0, PREV_HASH_VALUE, SQL_HASH_VALUE)
              ,DECODE(SQL_HASH_VALUE, 0, PREV_SQL_ADDR, SQL_ADDRESS)
          FROM V$SESSION B
         WHERE B.SID = '233') /* 此處233 為SID*/
 ORDER BY PIECE ASC;


SELECT * FROM V$PROCESS;


SELECT * FROM V$LOCK;


SELECT * FROM V$LOCKED_OBJECT;


SELECT * FROM V$TRANSACTION;


SELECT V.*
  FROM V$SESSION V
 WHERE MACHINE = 'xxx'
   AND USERNAME = 'xxx'
   AND STATUS = 'INACTIVE'
 ORDER BY LAST_CALL_ET DESC;


SELECT * FROM DBA_OBJECTS WHERE OBJECT_ID = '14977';


SELECT T2.USERNAME
      ,T2.SID
      ,T2.SERIAL#
      ,T3.OBJECT_NAME
      ,T2.OSUSER
      ,T2.MACHINE
      ,T2.PROGRAM
      ,T2.COMMAND
      ,T2.LAST_CALL_ET
  FROM V$LOCKED_OBJECT T1, V$SESSION T2, DBA_OBJECTS T3
 WHERE T1.SESSION_ID = T2.SID
   AND T1.OBJECT_ID = T3.OBJECT_ID
 ORDER BY T2.LOGON_TIME;

文章標籤
全站熱搜
創作者介紹
創作者 fantasy 的頭像
fantasy

fantasy 的恬淡心情

fantasy 發表在 痞客邦 留言(0) 人氣(1,275)