Oracle中鎖(lock)的用法
數(shù)據(jù)庫(kù)鎖介紹: https://www.jb51.net/article/248863.htm
一、查詢(xún)oracle鎖定的表:
1、鎖相關(guān)表
- SELECT * FROM v$lock;
列:ADDR:鎖定狀態(tài)對(duì)象地址;KADDR:鎖地址;SID :會(huì)話(huà)id;ID1:鎖標(biāo)識(shí)符#1;ID2:鎖標(biāo)識(shí)符#2;LMODE:會(huì)話(huà)持有的鎖模式(0~6);REQUEST:進(jìn)程請(qǐng)求的鎖模式(0~6);
CTIME:當(dāng)前模式的時(shí)間;BLOCK:為1代表阻礙者,表示正在阻礙其它會(huì)話(huà); - SELECT * FROM v$locked_object;
- SELECT * FROM v$session;
- SELECT * FROM v$session_wait;
- SELECT * FROM v$sqlarea;
- SELECT * FROM v$process ;
- SELECT * FROM all_objects
2、常用語(yǔ)句
1、查出鎖定object的session的信息以及被鎖定的object名
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user_name, s.machine, s.terminal, o.object_name, s.logon_timeFROM v$locked_object l, all_objects o, v$session sWHERE l.object_id = o.object_idAND l.session_id = s.sidORDER BY sid, s.serial#;
2、查出鎖定表的session的sid, serial#,os_user_name, machine name, terminal和執(zhí)行的語(yǔ)句,比上面那段多出sql_text和action
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.actionFROM v$sqlarea a, v$session s, v$locked_object lWHERE l.session_id = s.sidAND s.prev_sql_addr = a.addressORDER BY sid, s.serial#;
3、查出鎖定表的sid, serial#,os_user_name, machine_name, terminal,鎖的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine, s.terminal, s.logon_time, l.TYPEFROM v$session s, v$lock lWHERE s.sid = l.sidAND s.username IS NOT NULLORDER BY sid;
4、這個(gè)語(yǔ)句將查找到數(shù)據(jù)庫(kù)中所有的DML語(yǔ)句產(chǎn)生的鎖,還可以發(fā)現(xiàn),任何DML語(yǔ)句其實(shí)產(chǎn)生了兩個(gè)鎖,一個(gè)是表鎖,一個(gè)是行鎖。
SELECT /*+ rule */ s.username, DECODE(l.TYPE, "TM", "TABLE LOCK", "TX", "ROW LOCK", NULL) LOCK_LEVEL, o.owner, o.object_name, o.object_type, s.sid, s.serial#, s.terminal, s.machine, s.program, s.osuserFROM v$session s, v$lock l, dba_objects oWHERE l.sid = s.sidAND l.id1 = o.object_id(+)AND s.username IS NOT NULL;
5、如果發(fā)生了鎖等待,我們可能更想知道是誰(shuí)鎖了表而引起誰(shuí)的等待,以下的語(yǔ)句可以查詢(xún)到誰(shuí)鎖了表,而誰(shuí)在等待。
以下查詢(xún)結(jié)果是一個(gè)樹(shù)狀結(jié)構(gòu),如果有子節(jié)點(diǎn),則表示有等待發(fā)生。如果想知道鎖用了哪個(gè)回滾段,還可以關(guān)聯(lián)到V$rollname,其中xidusn就是回滾段的USN
SELECT LPAD(" ", DECODE(l.xidusn, 0, 3, 0)) || l.oracle_username user_name, o.owner, o.object_name, o.object_type, s.sid, s.serial#FROM v$locked_object l, dba_objects o, v$session sWHERE l.object_id = o.object_idAND l.session_id = s.sidORDER BY o.object_id, xidusn DESC
3、kill session語(yǔ)句:
alter system kill session 'sid,serial#';
alter system kill session'494,7355';
二、一個(gè)有用查找腳本:
1、找到某表的鎖 所屬的sid,alter system kill session 'sid,serial#'
;即可
select v$lock.sid, decode(v$lock.type, "MR", "Media Recovery", "RT", "Redo Thread", "UN", "User Name", "TX", "Transaction", "TM", "DML", "UL", "PL/SQL User Lock", "DX", "Distributed Xaction", "CF", "Control File", "IS", "Instance State", "FS", "File Set", "IR", "Instance Recovery", "ST", "Disk Space Transaction", "TS", "Temp Segment", "IV", "Library Cache Invalida-tion", "LS", "Log Start or Switch", "RW", "Row Wait", "SQ", "Sequence Number", "TE", "Extend Table", "TT", "Temp Table", "Unknown") LockType, rtrim(owner) || "." ||object_name object_name, decode(lmode, 0, "None", 1, "Null", 2, "Row-S", 3, "Row-X", 4, "Share", 5, "S/Row-X", 6, "Exclusive", "Unknown") LockMode, decode(request, 0, "None", 1, "Null", 2, "Row-S", 3, "Row-X", 4, "Share", 5, "S/Row-X", 6, "Exclusive", "Unknown") RequestMode, ctime, block bfrom v$lock, all_objectswhere sid > 6and v$lock.id1 = all_objects.object_id;
2、查出被lock 的對(duì)象,然后 alter system kill session 'sid,serial#'
;
select object_id, session_id, serial#, oracle_username, os_user_name, s.processfrom v$locked_object a, v$session swhere a.session_id = s.sid;
三、LOCK TABLE
1、語(yǔ)法:
LOCK TABLE table_1 [,table_2, ..., table_n] IN lock_mode MODE NOWAIT
2、變量:
table_1,...,table_n: 一系列你想通過(guò)使用LOCK TABLE語(yǔ)句鎖住的數(shù)據(jù)庫(kù)表。
lock_mode: 對(duì)于某一數(shù)據(jù)庫(kù)表你要設(shè)定的鎖定模式。你可以從如下的鎖定模式中任選一個(gè)。
- EXCLUSIVE
- SHARE ROW EXCLUSIVE
- SHARE
- SHARE UPDATE
- ROW SHARE
- ROW EXCLUSIVE
NOWAIT: Oracle will not wait to lock the given Table(s), if the Table(s) is(are) not available
3、例子:
LOCK TABLE loan IN SHARE MODE ;LOCK TABLE region IN EXCLUSIVE MODE NOWAIT;LOCK TABLE acct IN SHARE UPDATE MODE;LOCK TABLE bank IN ROW EXCLUSIVE MODE NOWAIT;LOCK TABLE user IN SHARE ROW EXCLUSIVE MODE;LOCK TABLE branch IN ROW SHARE MODE NOWAIT;commit
到此這篇關(guān)于Oracle鎖(lock)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持。
相關(guān)文章:
1. 數(shù)據(jù)庫(kù)Oracle9i的企業(yè)管理器簡(jiǎn)介2. oracle觸發(fā)器介紹3. 快速刪除ORACLE重復(fù)記錄5. 整理Oracle數(shù)據(jù)庫(kù)碎片6. 學(xué)好Oracle的六條總結(jié)7. 關(guān)于Oracle數(shù)據(jù)庫(kù)中的鎖機(jī)制深入研究8. 兩個(gè)有用的oracle數(shù)據(jù)庫(kù)運(yùn)算:intersect和minus運(yùn)算9. 講解基于Oracle高性能動(dòng)態(tài)SQL程序開(kāi)發(fā)10. oracle 指定類(lèi)型和指定位數(shù)創(chuàng)建序列號(hào)的代碼詳解
