深入浅出oracle锁---原理篇
在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些共享资源的并发性访问串行化,oracle中的锁就可以提供这样的功能,当事务在对某个对象进行操作前,先向系统发出请求,对其加相应的锁,加锁后该事务就对该数据对象有了一定的控制权限,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作(可以做select动作,但select 利用的是undo中的前镜像数据了)。

Oracle锁的分类

Oracle锁基本上可以分为二类
a:共享锁(share locks)  也称读锁,s锁
b:排它锁 (exclusive locks) 也称写锁,x锁

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

按锁保护的内容分类

oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为
a:dml锁,data locks 数据锁,用来保护数据的完整性和一致性
b:ddl 锁,dictionary locks 字典锁,用来保护数据对象的结构,如table,index的定义
c:内部锁和闩 internal locks and latchs 用来保护数据库内部结构,如sga内存结构

DML锁:

DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。当Oracle执行delete,update,insert,select for update  DML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。当TM锁获得后,再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位(lb 即lock bytes)进行置位。

在记录被某一会话锁定后,其他需要访问被锁定对象的会话会按先进先出的方式等待锁的释放,对于select操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,实际上,在此情况下,oracle是用到undo的内容进行一致性读来实现的。

在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。在数据行上只有X锁(排他锁),就是说TX锁只能是排他锁,在记录行上设置共享锁没有意义。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。

和锁相关的性能视图介绍:

v$lock
SID             会话的sid,可以和v$session 关联   
TYPE           区分该锁保护对象的类型,如tm,tx,rt,mr等
ID1             锁表示1,详细见下说明                
ID2             锁表示2,详细见下说明           
LMODE        锁模式,见下面说明             
REQUEST    申请的锁模式,同lmode                 
CTIME        已持有或者等待锁的时间                
BLOCK        是否阻塞其他会话锁申请 1:阻塞 0:不阻塞

LMODE        取值0,1,2,3,4,5,6, 数字越大锁级别越高, 影响的操作越多。
1级锁:
Select,有时会在v$locked_object出现。

2级,即RS锁:
相应的sql有:Select for update ,Lock xxx in  Row Share mode,select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。

3级锁,即RX锁:
相应的sql有:Insert, Update, Delete, Lock xxx in Row Exclusive mode,没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

4级锁,即S锁:
相应的sql有:Create Index, Lock xxx in Share mode

5级锁,即SRX锁:
相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update/delete ... ; 可能会产生4,5的锁。

6级锁,即X锁:
相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive mode

ID1,ID2的取值含义根据type的取值而有所不同

对于TM 锁
ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0

对于TX 锁
ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:  0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
                                             
v$locked_object
XIDUSN                      undo segment number , 可以和v$transaction关联    
XIDSLOT                     undo slot number      
XIDSQN                      序列号                         
OBJECT_ID                 被锁定对象的object_id ,   可以和dba_objects关联
SESSION_ID               持有该锁的session_id,     可以和v$session关联
ORACLE_USERNAME   持有该锁的oracle帐号                     
OS_USER_NAME         持有该锁的操作系统帐号                      
PROCESS                   操作系统的进程号,可以和v$process关联      
LOCKED_MODE          锁模式,含义同v$lock.lmode

dba_locks 和v$lock 内容差不多,略

V$session 如果某个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息
ROW_WAIT_FILE#      等待的行所在的文件号
ROW_WAIT_OBJ#       等待的行所属的object_id
ROW_WAIT_BLOCK#  等待的行所属的block
ROW_WAIT_ROW#     等待的行在blcok中的位置

手工释放锁
alter system kill session 'sid,serial#';

转载于:https://www.cnblogs.com/Cqiang/archive/2013/03/08/2949809.html

[转] 深入浅出oracle锁---原理篇相关推荐

  1. oracle什么是全局锁,深入浅出oracle锁---原理篇

    这几天项目中遇到了数据库锁的问题,还在解决中,找到了一篇原理性的文章,分享一下. 在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个 ...

  2. 深入浅出oracle锁原理篇

    在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些 ...

  3. oracle无会话锁表,深入浅出oracle锁 原理篇 停止无反应的sql会话

    在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些 ...

  4. 深入浅出TCP/UDP 原理-UDP篇(2)及完整MATLAB实现UDP通信

    目录 调试代码在文末 写在前面 3. UDP疑难杂症 3.1 UDP的传输方式:面向报文 3.2 UDP数据包的发送和接收问题 3.3 UDP丢包问题 3.4 UDP冗余传输 4 UDP真的比TCP要 ...

  5. 深入浅出 GAN·原理篇文字版(完整)

    深入浅出 GAN·原理篇文字版(完整)|干货 机翼技术 百家号 05-29 02:02 导语 这次的内容主要是想梳理 GAN 从 NIPS 2014 被提出,到 2017年5月,都有哪些重要的从原理和 ...

  6. 深入浅出 GAN·原理篇文字版(完整)|干货

    这是一篇非常好的干货文章,深入浅出,所以我把它转载过来,分享给大家.也方便自己日后查看. 转载声明:本文转载自「程序媛的日常」,搜索「girlswhocode」即可关注. 导语 这次的内容主要是想梳理 ...

  7. Java Synchronized 重量级锁原理深入剖析上(互斥篇)

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  8. 木马冰河之原理篇(深入浅出看木马)

    主题:木马冰河之原理篇(转载) 在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之一 冰河为例,向大家剖 ...

  9. 深入浅出 GAN·原理篇文字版(完整)| 干货

    首先来看看 GAN 现在能做到哪些惊艳的事呢? GAN 可以被用来学习生成各种各样的字体--也就是说,以后字迹辨认这种侦查手段很可能就不靠谱啦!这个工作还有很多动图,在 GitHub 上搜 zi2zi ...

  10. 深入浅出-数据库的原理

    原址:点击打开链接 如果有人问你数据库的原理,叫他看这篇文章 英文出处: Christophe Kalenzaga . 一提到关系型数据库,我禁不住想:有些东西被忽视了.关系型数据库无处不在,而且种类 ...

最新文章

  1. C#方法中的反射方式和委托方式(小实例)
  2. 在表格中批量显示图片
  3. SetBkMode函数用法详解
  4. java命令行选项6_6.jdk命令行工具
  5. Codeforces Round #645 (Div. 2)(AB)
  6. sql 中on和where的区别
  7. 【转】C++/CLI简介(什么是C++/CLI) -------C++/CLI 编程系列一
  8. 我在中关村,给不了的你爱的国贸(ZZ)
  9. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
  10. 软件测试 学习之路 linux vim编辑器
  11. quartus生成qdb文件_(原创)详解Quartus导出网表文件:.qxp和.vqm
  12. Java--对象复制
  13. python try catch语句_Java try catch语句
  14. 聊天工具机器人开发_聊天机器人-精致的交流工具? 还是您的客户服务团队不可或缺的成员?...
  15. VC 2015 x86的DLL绿色包(QT 5.6)
  16. vue引入,两种组件库vant,vue-ydui变量冲突问题
  17. 外贸商城建站程序, sylius和magento哪一个更适合企业二次开发
  18. 设计师都爱用的UI标注软件有哪些?
  19. 它来了它来了,群晖NAS外网远程访问设置教程终于来了
  20. 中国篆刻艺术孙溟㠭作品《无有中无尽藏》

热门文章

  1. 如何将常用软件在Finder工具栏上置顶?
  2. iOS系统突然故障卡死怎么办?快速解决不求人
  3. 使用Tenorshare iCareFone for mac如何对iPhone进行系统修复?
  4. 极棒开启AI挑战 全球寻找顶级语音合成“机械师”
  5. 翻译 | 上手 Webpack ? 这篇就够了!
  6. 大道至简第二章-‘是懒人造就了方法’读后感
  7. 如何让Activiti-Explorer使用sql server数据库
  8. [翻译] TLMotionEffect 重力感应
  9. 使用jquery 给span 赋值
  10. 9, Java NIO SocketChannel