Oracle锁
Posted 奔跑的金鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle锁相关的知识,希望对你有一定的参考价值。
Oracle所有锁的分配和管理都是数据库管理系统自动完成的,不需要用户进行干预。
v$lock表说明
字段 | 描述 |
ADDR | Address of lock state object |
KADDR | Address of lock |
SID | 会话的sid,可以和v$session 关联 |
TYPE | 所获得的或等待的锁类型,取值如下: ①Tx --事务 ②TM --表锁或DML ③MR --介质恢复 ④ST --磁盘空间事务 |
ID1 | 根据TYPE不同而有所不同 对于TM 锁 ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息 对于TX 锁 ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式: |
ID2 | 根据TYPE不同而有所不同 对于TM 锁 ID2 值为0 对于TX 锁 ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数 |
LMODE |
|
REQUEST | 大于0时,表示当前会话被阻塞,其它会话占有改锁的模式 |
TIME |
|
BLOCK |
|
若LMODE含有一个不是0或1的数值,则表明进程已经获得一个锁。若REQUEST列含有一个不是0或者1的数值,则表明进程正在等待一个锁,若LMODE列含有的数值全部是0,则表明进程正在等待一个锁。
监控锁
查看所信息
SELECT B.SID,C.USERNAME,C.TERMINAL,B.ID2,B.TYPE,B.LMODE,B.REQUEST FROM DBA_OBJECTS A,V$LOCK B,V$SESSION C WHERE A.OBJECT_ID(+)=B.ID1 AND B.SID=C.SID AND C.USERNAME IS NOT NULL ORDER BY B.SID,B.ID2
以下是在SQL*Plus中运行结果
set echo off:显示start启动的脚本中的每个sql命令,缺省为on
set pagesize 60:输出每页行数,缺省为24,为了避免分页,可设定为0。
column SID format 999 heading "SessionID":格式化SID列数字显示并且列名为SessionID
column USERNAME format A8:字段长度格式化为8 (Trunc为截取的意思)
format的格式元素
元素符号 | 说明 | 例子 |
An | 为varchar类型的列的列内容设置宽度,如果内容超过指定的宽度,则内容自动换行 | A10 |
9 | 设置number列的现实格式 | 999999 |
$ | 浮动的货币符号 | $99 |
L | 本地的货币符号 | L99 |
. | 小数点位置 | 9999.9 |
, | 千位分隔符 | 9,999 |
锁的分类
锁 | 描述 | 加锁的方法 |
行共享锁RS | 对数据表定义行共享锁后,如果事务A获得,那么A事务可以进行并发查询、插入、删除及加锁,但不能以排他的方式存取该数据表 | lock table xx in row share mode |
行排他锁RX | 对数据表定义了行排他锁后,如果被事务A获得,那么A事务对数据表中的行数据有排他权限,其他事物可以对统一数据表进行增删改查及加锁,但是不能使用以下3种方式加锁: ①行共享锁 ②共享行排他锁 ③行排他锁 |
lock table xx in row exclusive mode |
共享锁S | 对数据表定义共享锁后,如果事务被A获得,其他事务可以执行并发查询和加共享锁但不能修改表,也不能使用以下3种方式加锁: ①排他锁 ②共享行排他锁 ③行排他锁 |
lock table xx in share mode |
共享行拍他锁SRX | 对数据表定义共享行拍他锁后,如果事务被A获得,其他事务可以执行并发查询和对其他数据行加锁,但不能修改表,也不能使用以下4种方式加锁: ①排他锁 ②共享行排他锁 ③行排他锁 ④共享锁 |
lock table xx in share row exclusive mode |
排他锁 | 排他锁是最严格的锁。如果事务被A获得,A可以执行对数据库的读写操作,其他事务可以执行查询,但是不能插入和修改、删除操作 | lock table xx in exclusive mode |
锁表案例
打开2个SQL*Plus窗口,此处我把这两个窗口的名称叫做P1,P2,分别连接到同一个用户;
在数据库中有表TMP005,结构与数据如下:
TY |
A |
B |
C |
1.先在P1窗口删除值为A的记录
2.先在P2窗口删除值为B的记录
3.然后回到P1删除值为B的记录
4.接着回到P2删除值为A的记录
从上面2图我们可以初步发现,死锁已经形成了,接下来就是解锁
以上是关于Oracle锁的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段
Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段