从浅到深掌握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集合框架 ...
随机推荐
- WP8_ListBox的用法
在Windows Phone 7 Tips (5) 中曾经提到,在Windows Phone 7 中页面的布局一般分为:Panoramic.Pivot.List和Full Screen.而通常List ...
- 数据库连接池问题 Max Pool Size
摘自: http://blog.csdn.net/chensirbbk/article/details/6225268 Timeout expired 超时时间已到. 达到了最大池大小 错误及Max ...
- ntfs安全权限和共享权限的区别
win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的,NTFS权限是对文件夹设置的. 用户对文件夹有什么权限就是看NTFS权限的设置. 如果一个文件夹设置成共享,其具体的权限还 ...
- CentOS 5.X安装LAMP最高版本环境
#------------CentOS 5.X安装LAMP最高版本环境------------------#! /bin/sh #安装Apacheyum install httpd -y#1.关闭se ...
- 判断字符串是否包含字母‘k’或者‘K’
判断字符串是否包含字母‘k’或者‘K’ public bool IsIncludeK(string temp) { temp = temp.ToLower(); if (temp.Contains(' ...
- Knockout.Js官网学习(click绑定)
前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h ...
- Centos6.5环境下安装SVN 整合Apache+SSL
弄了两天,终于在服务器上初步搭建起来了SVN(版本1.8). 服务器系统:Centos6.5 64位,搭建过程中全部采用源码编译安装(configure/make/make install),推荐大家 ...
- Android中style的使用
摘自搜搜问问. <item name="#1">#2</item> 1.item 的name属性#1可以为所有系统所带组件的属性,#2为此属性的值如andr ...
- Delphi XE5 for android 使用 BITMAP STYLE DESIGNER 改变控件背景
一.BITMAP STYLE DESIGNER 工具集成在IDE开发工具的TOOLS菜单. 使用NEW 新建一个安卓样式.NEW—NEW ANDROID STYLE FOR FIREMONKEY. 这 ...
- C# 调用系统API 内核 简单样例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...