ORACLE原理:Oracle中锁(lock)的用法
2、查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句,比上面那段多出sql_text和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#;
3、查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;
4、这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
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.osuser
FROM v$session s, v$lock l, dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username IS NOT NULL;
5、如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待,以下的语句可以查询到谁锁了表,而谁在等待。
以下查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY o.object_id, xidusn DESC
3、kill session语句:
alter system kill session 'sid,serial#';
alter system kill session'494,7355';
二、一个有用查找脚本:
1、找到某表的锁 所属的sid,alter system kill session 'sid,serial#'
;即可
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 b
from v$lock, all_objects
where sid > 6
and v$lock.id1 = all_objects.object_id;
2、查出被lock 的对象,然后 alter system kill session 'sid,serial#'
;
from v$locked_object a, v$session s
where a.session_id = s.sid;
三、LOCK TABLE
1、语法:
NOWAIT
2、变量:
table_1,…,table_n: 一系列你想通过使用LOCK TABLE语句锁住的数据库表。
lock_mode: 对于某一数据库表你要设定的锁定模式。你可以从如下的锁定模式中任选一个。
- 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 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
到此这篇关于Oracle锁(lock)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。