今天開發同事代碼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; |