Oracle中锁(lock)的用法

数据库锁介绍: https://www.jb51.net/article/248863.htm

一、查询oracle锁定的表:

1、锁相关表

  • SELECT * FROM v$lock; 
    列:ADDR:锁定状态对象地址;KADDR:锁地址;SID :会话id;ID1:锁标识符#1;ID2:锁标识符#2;LMODE:会话持有的锁模式(0~6);REQUEST:进程请求的锁模式(0~6); 
    CTIME:当前模式的时间;BLOCK:为1代表阻碍者,表示正在阻碍其它会话;
  • 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、常用语句

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_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial#;

2、查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句,比上面那段多出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.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

SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine, s.terminal, s.logon_time, l.TYPE
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;

4、这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

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.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

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 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#';即可

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 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#';

select object_id, session_id, serial#, oracle_username, os_user_name, s.process
from v$locked_object a, v$session s
where a.session_id = s.sid;

三、LOCK TABLE

1、语法:

LOCK   TABLE   table_1   [,table_2,   ...,   table_n]   IN   lock_mode   MODE
  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   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

到此这篇关于Oracle锁(lock)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Oracle数据表中的死锁情况解决方法

    在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定: 1.查找被锁定的表: select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status from v$locked_object l, all_objects a where l.object_id=a.object_id; 如果想知道具体是哪

  • 基于oracle中锁的深入理解

    ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁3:Row-X 行专用(RX):用于行的修改4:Share 共享锁(S):阻止其他DML操作5:S/Row-X 共享行专用(SRX):阻止其他事务操作6:exclusive 专用(X):独立访问使用 数字越大锁级别越高, 影响的操作越多.1级锁有:Select,有时会在v$locked_object出现. 2级锁有:Select for update,Lock For Update,Lock Ro

  • Oracle删除死锁进程的方法

    本文实例讲述了Oracle删除死锁进程的方法.分享给大家供大家参考.具体如下: 步骤1:用以下SQL查看进程列表,判断出被锁定的表 复制代码 代码如下: SELECT dob.OBJECT_NAME Table_Name,lo.SESSION_ID||', '||vss.SERIAL# 删除号, lo.locked_mode,lo.SESSION_ID, vss.SERIAL#,vss.action Action,vss.osuser OSUSER, vss.LOGON_TIME, vss.pr

  • oracle查询锁表及解锁,修改表字段名与复制表结构和数据的方法

    在Oracle中查询锁表及解锁: 锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locked_object; 查看哪个表被锁: select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; 查看是哪个session引起

  • Oracle 死锁的检测查询及处理

    死锁查询语句: -- 死锁查询语句 SELECT bs.username "Blocking User", bs.username "DB User", ws.username "Waiting User", bs.SID "SID", ws.SID "WSID", bs.serial# "Serial#", bs.sql_address "address", bs.

  • oracle处理锁表基本操作

    查询锁表 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid ; 杀表(程序内杀) alter system kill session '543,9206'; 如果杀不掉可以查这个来获取spid(将获取的spid给有权限的网络管理员,他就给你杀了.这个属于

  • oracle锁表该如何解决

    废话不多说 上语句: 查询锁表语句: select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid; 杀掉查到的进程: alter system kill session 'sid,serial#'; 例如: alter system kill session '2

  • Oracle 查询死锁并解锁的终极处理方法

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀. 1.下面的语句用来查询哪些对象被锁: 复制代码 代码如下: select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id =

  • Oracle锁处理、解锁方法

    1.查询锁情况 select sid,serial#,event,BLOCKING_SESSION from v$session where event like '%TX%'; 2.根据SID查询具体信息(可忽略) select sid,serial#,username,machine,blocking_session from v$session where sid=<SID>; 3.杀掉会话 #根据1和2中查到的SID和SERIAL# 定位会话,并杀掉 ALTER SYSTEM DISC

  • Oracle中游标Cursor基本用法详解

    查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中.SELECT INTO语法如下: SELECT [DISTICT|ALL]{*|column[,column,...]} INTO (variable[,variable,...] |record) FROM {table|(sub-query)}[alias] WHERE............ PL/SQL

  • oracle中add_months()函数及用法总结

    今天对add_months函数进行简单总结一下: add_months 函数主要是对日期函数进行操作,在数据查询的过程中进行日期的按月增加,其形式为: add_months(date,int);其中第一个参数为日期,第二个为按月增加的幅度,例如: add_months (sysdate,2):就是当前日期的两个月之后的时间. 如:表示2个月以后的时间: SQL> select add_months(sysdate,2) from dual; ADD_MONTHS(SYSDATE,+2) ----

  • Oracle 中Contains 函数的用法

    1. 查询住址在北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'beijing' ) remark: beijing是一个单词,要用单引号括起来. 2. 查询住址在河北省的学生 SELECT student_id,student_nameFROM students WHERE CONTAINS( address, '"HEIBEI province"' ) remark: HEBE

  • Oracle中ROW_NUMBER()OVER()函数用法实例讲解

    目录 1. 说明: 2. 原理: 3.语法: 4.示例一: 5. 示例二 总结 Oracle中ROW_NUMBER() OVER()函数用法 1. 说明: ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,over() 里的分组以及排序的执行晚于 where.group by.order by 的执行. 3.语法: row_number() over( partition by 分组列 order by 排序列 desc )

  • Oracle中游标Cursor的用法详解

    目录 一.使用游标 1.定义游标 2.打开游标 3.提取数据 4.关闭游标 5.游标属性 6.参数游标 二.for循环遍历,实现遍历游标最高效方式. 三.使用游标更新或删除数据 四.通过bulk collect减少loop处理的开销 五.使用游标变量 1.游标变量使用步骤 1.1定义ref cursor类型和游标变量 1.2打开游标 1.3提取游标数据 1.4关闭游标变量 2.游标变量使用示例 一.使用游标 对于DML语句和单行select into ,oracle自动分配隐形游标.处理sele

  • oracle中lpad函数的用法详解

    oracle中lpad的用法 pad翻译:填充 lpad函数,在字符串的左侧添加指定字符串,用法: www.jb51.net lpad(String ,截取长度,添加的字符串). 说是添加字符串也不准确,比较准确的说法是对String进行截取字符串, 如果截取长度大于String的长度,则在 String的左侧添加字符串进行填补,如果第三个参数未指定,则用空格进行填补. 例如: select lpad('test',10) from dual; 将返回" test" select lp

  • Oracle中PL/SQL的用法总结

    目录 一.PLSQL基本结构 1.基本数据类型变量 1. 基本数据类型 2. 基本数据类型变量的定义方法 2.表达式 1. 数值表达式 2. 字符表达式 3. 关系表达式 4. 逻辑表达式 3.PLSQL函数 4.系统输出打印 5.PL/SQL中的变量声明 二.变量赋值方式 三.PLSQL复合类型 1.记录类型record 2.表类型变量table 1. 定义一维表类型变量 2. 定义多维表类型变量 四. %type和%rowtype 五.PLSQL变量的可见空间 六.PLSQL流程控制 if判

  • Oracle中dbms_output.put_line的用法实例

    目录 1.enable: 2.disable: 3.put: 4.put_line: 5.new_line: 6.get_line(value, index): 7.get_lines(array, index): 总结 dbms_output.put_line的用法 涉及到的知识点如下: 1.enable: 在serveroutput on的情况下,用来使dbms_output生效(默认即打开) set serveroutput on --将output 服务打开 2.disable: 在se

  • Oracle中锁(lock)的用法

    数据库锁介绍: https://www.jb51.net/article/248863.htm 一.查询oracle锁定的表: 1.锁相关表 SELECT * FROM v$lock; 列:ADDR:锁定状态对象地址;KADDR:锁地址;SID :会话id;ID1:锁标识符#1;ID2:锁标识符#2;LMODE:会话持有的锁模式(0~6);REQUEST:进程请求的锁模式(0~6); CTIME:当前模式的时间;BLOCK:为1代表阻碍者,表示正在阻碍其它会话; SELECT * FROM v$

随机推荐