【IT168 技术文档】
    1 引言—数据库锁的基本概念

为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。

排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。

共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。

2 Oracle 多粒度封锁机制介绍 

    根据保护对象的不同,Oracle数据库锁可以分为以下几大类:

(1) DML lock(data locks,数据锁):用于保护数据的完整性;

(2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);

(3) internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构;

(4) distributed locks(分布式锁):用于OPS(并行服务器)中;

(5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

本文主要讨论DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。

   2.1 Oracle的TX锁(行级锁、事务锁)

许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。

在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。 
    
    2.2 TM锁(表级锁) 

    2.2.1 意向锁的引出

表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。

意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。

    2.2.2 意向锁的类型

由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:

意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;

意向排它锁(Intent Exclusive Lock,简称IX锁):如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。

另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的“=”指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。

这样我们又可以引入一种新的锁的类型。

共享意向排它锁(Shared Intent Exclusive Lock,简称SIX锁) :如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如:事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX锁)。

这样数据库对象上所加的锁类型就可能有5种:即S、X、IS、IX、SIX。

具有意向锁的多粒度封锁方法中任意事务T要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。

   2.2.3 Oracle的TM锁(表级锁)

Oracle的DML锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即X锁),但其TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁(X锁)、行级共享锁(RS锁)、行级排它锁(RX锁)、共享行级排它锁(SRX锁),与上面提到的S、X、IS、IX、SIX相对应。需要注意的是,由于Oracle在行级只提供X锁,所以与RS锁(通过SELECT … FOR UPDATE语句获得)对应的行级锁也是X锁(但是该行数据实际上还没有被修改),这与理论上的IS锁是有区别的。

下表为Oracle数据库TM锁的相容矩阵(Y=Yes,表示相容的请求; N=No,表示不相容的请求;-表示没有加锁请求):

T2

T1

S

X

RS

RX

SRX

-

S

Y

N

Y

N

N

Y

X

N

N

N

N

N

Y

RS

Y

N

Y

Y

Y

Y

RX

N

N

Y

Y

N

Y

SRX

N

N

Y

N

N

Y

-

Y

Y

Y

Y

Y

Y

表一:Oracle数据库TM锁的相容矩阵

一方面,当Oracle执行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FOR UPDATE)或RX锁(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请TX锁,并将实际锁定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过LOCK TABLE语句来指定获得某种类型的TM锁。下表总结了Oracle中各SQL语句产生TM锁的情况:

SQL语句

表锁模式

允许的锁模式

Select * from table_name……

RS、RX、S、SRX、X

Insert into table_name……

RX

RS、RX

Update table_name……

RX

RS、RX

Delete from table_name……

RX

RS、RX

Select * from table_name for update

RS

RS、RX、S、SRX

lock table table_name in row share mode

RS

RS、RX、S、SRX

lock table table_name in row exclusive mode

RX

RS、RX

lock table table_name in share mode

S

RS、S

lock table table_name in share row exclusive mode

SRX

RS

lock table table_name in exclusive mode

X

表二:Oracle数据库TM锁小结

  3 Oracle 多粒度封锁机制的监控

    3.1 系统视图介绍

为了监控Oracle系统中锁的状况,我们需要对几个系统视图有所了解:

    3.1.1 v$lock视图

v$lock视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下:

字段名称

类型

说明

SID

NUMBER

会话(SESSION)标识;

TYPE

VARCHAR(2)

区分该锁保护对象的类型;

ID1

NUMBER

锁标识1;

ID2

NUMBER

锁标识2;

LMODE

NUMBER

锁模式:0(None),1(null),2(row share), 3(row )

转载于:https://blog.51cto.com/sunwayle/415150

Oracle DML封锁机制研究相关推荐

  1. 万字长文深入探究Oracle DML锁机制

    点击上方"蓝字" 关注我们,享更多干货! 1.1. 锁的基本概念 锁的定义:锁(lock)机制用于管理对共享资源的并发访问,用于多用户的环境下,可以保证数据库的完整性和一致性.锁是 ...

  2. Linux内存管理机制研究

    Linux内存管理机制研究 查看linux系统中处于free状态的内存有两个角度,一个是从内核的角度来看,一个是从应用层的角度来看的. 1.从内核的角度来看free的内存,就是内核目前可以直接分配到, ...

  3. MySQL redo log 重做日志 原理 Oracle Redo Log 机制 小结

    MySQL-重做日志 redo log -原理 [redo log buffer][redo log file]-原理 目录: 1.重做日志写入过程图 2.相关知识点汇总图 3.redo_log_bu ...

  4. Oracle 12C In-Memory特性研究

    Oracle 12C In-Memory特性研究 一.Oracle In-Memory 1.1 In-Memory 开启方法 1.2 开启与关闭IM column store 1.3 inmemory ...

  5. oracle的购买价格研究

    # 第一章 如果你是一个架构师,在数据库选型上除了技术选型,更重要的可能是性价比的选择,而oracle是现今排名第一的数据库,因此对oracle的价格有所了解是必须的. 几个要点: 1.oracle授 ...

  6. 肠道菌群机制研究及国自然课题设计专题会议

    肠道菌群机制研究及国自然课题设计专题会议 如何设计测序方案.测序后的数据如何应用和延伸 时间:3.13-3.14 线上直播,赠送回放视频,长期答疑群 报名方式请下拉至文末 学习背景介绍 "肠 ...

  7. linux kernel and user space通信机制,Linux内核与用户空间通信机制研究.pdf

    ISSN 1009-3044 E-mail:info@CCCC.net.CR ComputerKnowledgeandTechnology电脑知识与技术 http://www.dnzs.net.cn ...

  8. 多溴联苯醚内分泌干扰效应机制研究取得进展

    中国科学院生态环境研究中心环境化学与生态毒理学国家重点实验室郭良宏研究组在多溴联苯醚 (PBDEs) 内分泌干扰效应的机制研究中取得新进展,相关成果近日发表于国际期刊Environmental Hea ...

  9. c++容器共性机制研究

    容器共性机制研究 容器的共通能力 各个容器的使用时机 容器的共通能力 C++模板是容器的概念. 理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意.容器执行插入元素的 ...

最新文章

  1. 图灵访谈 | 王贝珊:乘风破浪的成长之路
  2. python导入pandas出错_构建d时如何解决python-pandas导入错误
  3. 感想3-对于业务逻辑复用、模板复用的一些思考(未完)
  4. python pip download_Python Pip 参考手册 - pip download 命令
  5. Best Time to Buy and Sell Stock III O(n) 求解方法
  6. Vultr 修改 Root 密码
  7. 开源大数据周刊-第22期
  8. [趣谈网络协议学习] 01 网络分层
  9. 计算机主机发出滴滴声音怎么办,电脑蓝屏后主机滴滴的响应该怎么处理教程
  10. 方面和服务,差别大吗?
  11. 《算法笔记》9.4小节 9.5小节——数据结构专题(2)->二叉查找树(BST)->平衡二叉树(AVL)
  12. windows下maven打包镜像并推送docker服务器
  13. 1024程序员节,以梦为马,不负韶华,我们来聊聊IT的发展以及个人感受吧!
  14. 页面水印 原生js 兼容ie8浏览器
  15. layui实现文件压缩上传_基于SSM框架、Layui的多文件上传、包括图片,压缩包,音频等文件(与数据库挂钩) - 爱秧博客...
  16. 文件上传:避免重复上传
  17. win11打不开文件夹,一直转圈,卡死没反应,黑屏卡死
  18. 2022最新版本开运网运势测算网站数据node.js版接口数据H5网站算命接口
  19. C语言经典分油问题,分油问题C语言.doc
  20. 领导力提升必看的10本书

热门文章

  1. 我如何判断漏洞奖励计划是否值得参加?如何获得最大收益?
  2. 多款 D-Link 路由器受多个 RCE 漏洞影响
  3. 统计学习方法---牛顿法
  4. hdu 4640 Island and study-sister(状态压缩dp)
  5. 一个批量转换文本文件编码的程序(Python)
  6. [Java] 蓝桥杯ALGO-103 算法训练 完数
  7. [Python] L1-029. 是不是太胖了-PAT团体程序设计天梯赛GPLT
  8. 蓝桥杯 ALGO-43 算法训练 A+B Problem
  9. 蓝桥杯 BEGIN-1 入门训练 A+B问题
  10. L1-004. 计算摄氏温度-PAT团体程序设计天梯赛GPLT