oracle 查鎖 殺鎖 批量處理鎖

今天開發同事代碼bug,導致數據庫多張表被鎖,我又重新複習了下oracle殺鎖,並記錄下來

查詢數據庫鎖的情況,使用具有DBA權限賬戶或者system賬戶執行

單個鎖或者少許鎖

      SELECT l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
FROM v$sqlarea a, v$session s, v$locked_object l
WHERE l.session_id = s.sid AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;


--kill session語句
alter system kill session'50,492';

或者用下面語句
查看被鎖的表


SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name
 FROM v$process p, v$session a, v$locked_object b, all_objects c
 WHERE p.addr = a.paddr 
 AND a.process = b.process
 AND c.object_id = b.object_id
查看是哪個進程鎖的 
SELECT sid, serial#, username, status, osuser FROM v$session  where serial# = '11016'


 
殺掉這個進程  

alter system kill session '72,11016';


如果鎖比較多,使用批量解鎖


declare cursor mycur is   
select b.sid,b.serial#   
  from v$locked_object a,v$session b   
  where a.session_id = b.sid group by b.sid,b.serial#;   
   
begin   
  for cur in mycur   
    loop     
     execute immediate ( 'alter system  kill session  '''||cur.sid || ','|| cur.SERIAL# ||''' ');   
     end loop;   
end;

執行輸出結果就行了

同時記錄下,鎖的5種情況

Oracle五種表級排他鎖的總結和歸納

Oracle的五種表級鎖很容易弄混,下面介紹這如果一個事務擁有五種鎖,各種情況的權限和對其他事務的約束。

鎖的名稱

對其它事務的約束

擁有此鎖的事務的權利

其他事務的權利

加鎖語句

共享鎖

(Share Table Lock,S)

允許其他事務對同一表上加共享鎖

當一個表只有一個共享鎖時,擁有此鎖的事務可以進行數據更新操作(比如insert ,update等),但多個事務都對同一個表擁有共享鎖時,任何一個事務都只能進行select操作。

只能進行select操作

Lock Table TableName In Share Mode;

排他所

(Exclusive Table Lock,X)

不允許其他事務對同一表進行任何加鎖操作

擁有鎖的事務可以進行表的任何操作

只能進行select操作

Lock Table TableName In Exclusive Mode;

行級共享鎖

(Row Share Table Lock,RS)

不允許其他事務進行同一表上加排他鎖(這是因爲排他鎖本身的特性:本來加了排他鎖的事務就不允許其他事務對同一表加任何鎖)

擁有更新權

允許其他事務的更新權。

SELECT . . . FROM TableName. . . FOR UPDATE OF . . . ;

Lock Table TableName In Share Row Mode;

行級排他鎖

(Row Exclusive Table Lock,RX)

允許其他事務進行同一表的其他行加行排他和行共享鎖;不允許其他事務對加共享鎖或排他所

擁有更新權

其他事務擁有更新權

INSERT INTO TableName. . . ;

UPDATE TableName. . . ;

DELETE FROM TableName. . . ;

LOCK TABLE TableName IN ROW EXCLUSIVE MODE;

共享行排他

(Share Row Exclusive Table Lock,SRX)

不允許其他事務進行同一表的任何列加行排他鎖,只能加行共享

鎖的擁有事務對錶有更新權

其他事務只有查詢權

Lock Table TableName In Share Row Exclusive Mode;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章