从浅到深掌握Oracle的锁
SQL> select * from
t1;
ID
SQL> alter table t1 add primary key(id);
表已更改。
SQL> select * from v$lock where type in ('TX','TM');
未选定行
SQL> insert into t1
);
已创建
行。
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TX
会话二:
);
__
(阻塞)
会话一:
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TX
(此处出现申请号锁, TM
TM
TX
TX
SQL> update t1 set
id ;
已更新 行。
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TX
;
SID
SQL> select sid,event
,);
SID
EVENT
SQL*Net message from
client
SQL*Net message from
client
会话二:
SQL> select
sid ;
SID
;
__(阻塞)
会话一:
,);
SID
EVENT
enq: TX - row lock
contention(等待事件出现tx锁,原因是行锁争用)
SQL*Net message from
client
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TX
(可以看到会话二在申请号锁,而的TX锁block为,表示阻塞了别的会话)
TM
TM
TX
SQL> delete t1 where
id;
已删除 行。
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TX
;
SID
SQL> select sid,event
,);
SID
EVENT
SQL*Net message from
client
SQL*Net message from
client
会话二:
SQL> select
sid ;
SID
;
__(阻塞)
会话一:
,);
SID
EVENT
enq: TX - row lock
contention(等待事件出现tx锁,原因是行锁争用)
SQL*Net message from
client
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TX
(可以看到会话二在申请号锁,而的TX锁block为,表示阻塞了别的会话)
TM
TM
TX
KADDR
SID:锁所在的会话id
TYPE:锁的类型,类型有很多种,常用的有TX(事务锁)、TM锁(表级锁)
ID1:TM锁为对象的object_id,TX锁为v$transaction 中 XIDUSN *
^ ,TX锁为v$transaction
中 XIDSQN
LMODE:锁的模式,有~,越大锁的限制越高,
REQUEST:为表示没有申请锁,其他~表示在申请该模式的锁
CTIME:表示锁从出现到现在的时间
BLOCK:为表示阻塞了其他会话申请锁,为表示没有阻塞别人。
会话一:
SQL> lock table t1
in share
mode;
表已锁定。
会话二:
SQL> update t1 set
id ;
__(等待)
直到会话一commit或roll,会话二执行。
锁模式 |
锁描述 |
含义 |
锁定表的SQL |
0 |
None |
||
1 |
Null |
空,本模式是oracle预留模式 |
|
2 |
Row Share(RS) 又叫(SS) |
行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存 |
Lock table t1 in row share mode; |
3 |
Row Exclusive Table Lock(RX) 又叫(SX) |
行级排他锁,通常已经有事务在修改行或者select…for update 修改结果集。允许其他事务对锁定的表进行select insert update delete |
Lock table t1 in row exclusive mode; |
4 |
Share Table Lock(S) |
共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它 |
Lock table t1 in share mode; |
5 |
Share Row Exclusive Table Lock(SRX) 又叫SSX |
共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改 |
Lock table t in share row exclusive mode; |
6 |
Exclusive Table Lock (X) |
排他锁,是限制最高的TM锁,禁止其他事务执行任何类型的DML语句或者锁表 一个表一般只能有一个号锁 |
Lock table t1 in exclusive |
锁模式 |
锁名称 |
允许级别 |
互斥级别 |
2 |
行级共享锁 |
2 3 4 5 6 |
|
3 |
行级排他锁 |
2 3 |
4 5 6 |
4 |
共享锁 |
2 4 |
3 5 6 |
5 |
共享行级排他锁 |
3 4 5 6 |
|
6 |
排他锁 |
2 3 4 5 6 |

、、SS,表结构共享锁
、SX,表结构共享锁、S, 表结构共享锁、SRX 表结构共享锁、X 表结构排它锁
SS, 表结构共享个S代表表结构共享,第个代表表里的数据共享.
你可以想象一下,当往子表里增 加纪录时,主表的相关主键是不是得处于共享模式.
SX, 用于DML操作,第个S代表表结构共享,第个代表表里被操作的数据独占.
S,
代表表结构+表里的数据都是处于共享模式.当对表创建索引时,在创建期间,表处于这种模式.
SRX)),
X, 删除表是会用上.
号锁
表已锁定。
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
和号锁
ID
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TM
TX
可以看到可以共存,没有互斥
号锁
表已锁定。
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TM
TX
因为和不能共存,因此升级为号锁
号锁,发生等待
__
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TM
TX
因为同是号会话,上号TM只需将原有升级,但是已经存在号TM,产生互斥,所以等待
in exclusive
mode;
表已锁定。
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
;
已更新 行。
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TX
;
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
;
已更新 行。
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');
SID
TY ID1 ID2 LMODE REQUEST BLOCK
TM
TM
TX
会话一:
SQL> update t1 set
id ;
已更新
行。
会话二:
;
已更新 行。
会话一:
SQL> update t2 set
id ;
__(等待)
会话二:
SQL> update t1 set
id ;
__(等待)
会话一:
SQL> update t2 set
id ;
行出现错误:
ORA:
等待资源时检测到死锁
在讲到lock的上文中已经提到,这种控制机制需要resource,lock联众数据结构,但是需要内存分配lock数据结构,对于粗粒度(可以理解为文件很大)或者数量有限的资源,使用这种机制还可以接受,因为分配的内存并不多。但是对于表的数据记录,动辄几百G
的表,每个记录如果都分配一个resource 和lock
数据结构对,无论从内存需求还是维护开销上都是一个噩梦。所以,对于数据记录这种细粒度的资源,oracle使用的是行级锁(row level
lock)。记数据块内存储的是一条条的用户记录,用户记录也是按照一定的格式保存的,每条记录可以分成 记录头 和 记录体
两部分。记录头中是描述信息,比如列宽度,和事务有关的是ITL Entry pointer字段。
这种锁保护的资源是回滚段,回滚数据块。因此这个申请也就意味着:用户必须先申请到一个回滚段资源后才能开始一个事务,才能执行语句修改数据。申请到回滚段资源后,用户事务就可以修改数据了。在修改数据表的记录时,需要遵循下面的操作顺序:
从浅到深掌握Oracle的锁的更多相关文章
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
- 『浅入深出』MySQL 中事务的实现
在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝 ...
- Oracle的锁表与解锁
Oracle的锁表与解锁 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) ...
- Oracle 6 - 锁
Oracle锁没有额外的开销?Oracle的锁是怎么实现的?因为其他数据库,锁都是一种稀有资源和开销. 答:代码级实现?? 没有锁的话,并发更新就会有丢失更新的问题. 悲观锁和乐观锁 悲观锁一般用于有 ...
- Oracle 6 - 锁和闩 - 锁类型
Oracle锁大类 1.DML锁 (SELECT, INSERT, UPDATE, DELETE, MERGE是对数据库加的锁, 可能是行锁,也可能是表锁) 2.DDL锁 (Create, Alter ...
- 浅谈一下SSI+Oracle框架的整合搭建
浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...
- ORACLE里锁有以下几种模式,v$locked_object,locked_mode【转】
ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4: ...
- oracle查询锁表解锁语句
--oracle查询锁表解锁语句--首先要用dba权限的用户登录,建议用system,然后直接看sql吧 --1. 如下语句 查询锁定的表: SELECT l.session_id sid, s.se ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
随机推荐
- Unieap3.5-Grid编辑列中数字与下拉改变
Grid列表中字段改变事件 <cell label="单据金额" width='20%' name="NFEE_1" id="NFEE_1&qu ...
- 【改进版】C++小程序中一个cout输出语句背后的堆栈知识
最开始写这篇文章的时候,凭着自己对汇编的一点理解就堆出了这些内容,经 egmkang的指点,才发觉自己是井底之蛙,花了半天的功夫,去学习顺序点等内容.针对上次写的程序,我决定添一些内容,把程序2后面的 ...
- app开发版面设计原则
(1) 单纯:形象和色彩必须简单明了(也就是简洁性). (2) 统一:造型与色彩必须和谐,要具有统一的协调效果. (3) 均衡:整个画面须要具有魄力感与均衡效果. (4) 展现重点:构成要素必须化繁为 ...
- C puzzles详解【46-50题】
第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...
- CSS: word-wrap和word-break
最近修改页面排版的一些问题,发现关于内容分词换行有两个主要的CSS: word-wrap 和 word-break 特别是word-wrap还有个取值break-word,更使得这两个属性容易混淆. ...
- Linux下发包处理
Linux下发包处理: 1.用top分析工具来查看哪个进程占用的CPU资源比较大 2. 通过命令来查看都是那些端口被占用了 netstat -antp | more 3.在top里面查看到的异 ...
- C# 判断一字符串是否为合法数字(正则表达式)
判断一个字符串是否为合法整数(不限制长度) public static bool IsInteger(string s) { string pattern = @"^\d*$"; ...
- [leetcode]_Unique Paths
题目:有一个m * n 的方格,如下图,一个小robot希望从左上角走到右下角,共有多少种不同的路线走法. 思路: 我的错误思路:全排列,从(0,0)走到(m - 1,n - 1)共需要往下走m-1步 ...
- Knockout.Js官网学习(event绑定、submit绑定)
event绑定 event绑定在DOM元素上添加指定的事件句柄以便元素被触发的时候执行定义的JavaScript 函数.大部分情况下是用在keypress,mouseover和mouseout上. 简 ...
- c#生成随机数示例分享
c#生成(随机数 http://www.jbxue.com/tags/suijishu.html)的代码. /// 构造随机数 种子 ]; System.Security.Cr ...