从浅到深掌握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集合框架 ...
随机推荐
- ASP.NET的SEO:基础知识
本系列目录 首先谈一点我自己的体会,我还是希望能和大家分享: 当你读到一定数量的SEO资料后,你会发现,对同一个问题,众说纷纭,莫衷一是.这其实主要是因为以下一些原因造成的:1. 很多SEO技巧,是& ...
- 搭建Android手机系统开发环境(转)
Android作为近来表现十分强劲的手机操作系统,越来越受到开发人员的青睐,本篇文章将带领大家从零开始打造属于自己的开发环境. 一.JDK下载安装 JDK全称是Java Development Kit ...
- EnCase v.s. FTK - find out Chinese characters writing in different direction
A friend of mine said to me that she could fool those forensic tools easily by changing writing dire ...
- PayPal 开发详解(七):运行REST API SAMPLE
1.编译成功,修改配置文件 sdk_config.properties ,使用我们申请的测试帐号执行收款测试,clientId 和 clientSecret 参见 PayPal 开发详解(五) 2.将 ...
- 破解Demo
需要破解的程序界面如下: 需要破解的程序的主要代码如下: void CEasyCrackMeDlg::OnBnClickedButtonOk() { // TODO: 在此添加控件通知处理程序代码 T ...
- wpf依赖属性、绑定实现原理、附加属性学习
依赖属性和普通属性相比节省内存的原因:对于普通属性,每个对象有需要存储一个普通属性的值,即便是默认值.而依赖属性的默认值是静态的存储在类中的,所有对象都使用同一默认值,所以对于拥有大量属性的控件来说这 ...
- .NET中的IO操作之文件流
读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...
- Creating a Unique File Name
If you are working with files or file attachments in PeopleCode, you will typically want to create a ...
- Winfrom 基于TCP的Socket 编程
基于TCP的Socket基础例子 服务端的代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); ...
- Silverlight中DataPager控件扩展
大家一定遇到这样的情况,想改变一下SL的DataPager的显示信息,比如希望分页控件上显示数据的总数.那么就需要扩展一下DataPager控件即可. 其实扩展DataPager很简单,只要获取到Da ...