从浅到深掌握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集合框架 ...
随机推荐
- dreamweaver cs6 的破解方法
dreamweaver cs6 的破解方法,很简单大家照着下面的方法做肯定能破解方法/步骤 安装DreamWeaver cs6 使用amtlib.dll破解下载amtlib.dll文件后,解压后得到 ...
- HTTP CHUNKED C实现
C语言不像C#一样有很多很多高度的模块化的东西可以使用,在通讯过程中特别是与http相关的通讯过程中可能要对网站返回的数据做一定处理,而且有不少网站的回应是强制性的,例如向网站请求deflate有个能 ...
- spring+hibernate--直接修改数据库,再通过hibernate查询数据不变
这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响. 刚好今天没事,想好好解决一下这个问题. hibernate主要配置如下: <property name="h ...
- 【C++面试】常考题复习:排序算法
// Sort.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> /*********** ...
- CentOS 6.x 播放 mp3 音乐 —— 成功
参考:http://blog.chinaunix.net/uid-14735472-id-3472898.html centos 6.x 添加 rpmforge 源--- CentOS 6.x 安装 ...
- C语言文法 改
<程序> -> <外部声明> | <程序> <外部声明> <外部声明> -> <函数定义> | &l ...
- Windows Phone 资源管理与换肤思考
新入手一台Windows 8的笔记本,安装了VS2013后,终于又可以开发WP了.公司暂时不愿意开发WP,那么咱就自行研究吧! 在没有WP开发环境的时候,曾经在WPF尝试了一下换肤功能的实现.最简单的 ...
- Linux Hugetlbfs内核源码简析-----(二)Hugetlbfs挂载
本文只讨论执行"mount none /mnt/huge -t hugetlbfs"命令后,mount系统调用的执行过程(基于Linux-3.4.51),不涉及进程相关的细节. m ...
- linux网络bond技术
http://blog.chinaunix.net/uid-20799583-id-3117665.html1.创建bond0配置文件vi /etc/sysconfig/network-scripts ...
- 在Array原型链上扩展remove,contain等方法所遇到的坑
相信jser兄弟们肯定会碰到这样一个问题, 在做数组类的操作的时候,会要求删除数组中的一个元素:亦或是判断某值是否存在于这个数组: OK,拿删除数组元素举例,扩展方法为: Array.prototyp ...