Oracle中锁(lock)的用法

 更新时间:2022年05月26日 15:47:21   作者:springsnow  
这篇文章介绍了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)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Oracle排名函数(Rank)实例详解

    Oracle排名函数(Rank)实例详解

    这篇文章主要介绍了Oracle排名函数(Rank)实例详解,需要的朋友可以参考下
    2014-06-06
  • Oracle基本查询过滤排序示例解析

    Oracle基本查询过滤排序示例解析

    以下是对Oracle中的基本查询过滤排序示例进行了详细的分析介绍,需要的朋友可以参考下
    2013-08-08
  • PLSQL环境配置详细图文步骤

    PLSQL环境配置详细图文步骤

    PL/SQL是Oracle对行业标准SQL的过程性扩展,下面这篇文章主要给大家介绍了关于PLSQL环境配置的详细图文步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • PLsql Oracle 下载安装图文过程详解

    PLsql Oracle 下载安装图文过程详解

    PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变量来连接Oracle数据库,当试用期到期时,可以通过修改注册表来重置试用期,对PLsql Oracle 下载安装相关操作感兴趣的朋友一起看看吧
    2025-02-02
  • Oracle 细粒度审计(FGA)初步认识

    Oracle 细粒度审计(FGA)初步认识

    细粒度审计(FGA),是在Oracle 9i中引入的,能够记录SCN号和行级的更改以重建旧的数据,本文将详细介绍,需要的朋友可以参考下
    2012-12-12
  • Oracle 11g+windows 环境下Ecology7系统安装过程

    Oracle 11g+windows 环境下Ecology7系统安装过程

    这篇文章主要介绍了Oracle 11g+windows 环境下Ecology7系统安装,安装步骤是以管理员模式运行Oracle setup.exe文件,根据提示安装Oracle,创建数据库,注意修改连接数,本文给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • Oracle 批处理自动备份bat脚本语句的步骤详解

    Oracle 批处理自动备份bat脚本语句的步骤详解

    这篇文章主要介绍了Oracle 批处理自动备份bat脚本语句的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Oracle12c的数据库向11g导进的方法

    Oracle12c的数据库向11g导进的方法

    这篇文章主要介绍了 Oracle12c的数据库向11g导进的方法的相关资料,需要的朋友可以参考下
    2016-03-03
  • Oracle通过递归查询父子兄弟节点方法示例

    Oracle通过递归查询父子兄弟节点方法示例

    这篇文章主要给大家介绍了关于Oracle如何通过递归查询父子兄弟节点的相关资料,递归查询对各位程序员来说应该都不陌生,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • 在ORACLE移动数据库文件

    在ORACLE移动数据库文件

    在ORACLE移动数据库文件...
    2007-03-03

最新评论