锁定能够保证当某个用户正在更新表里的一行数据时,其他用户不能同时更新相同的数据行,而且也不能删除或修改被更新的表。
锁定分为两种级别:行级别(TX锁)和表级别(TM锁)。
1、行级锁(TX锁)
假设某个用户(假设为A)发出如下的语句更新一条记录:
SQL> update employees set last_name='HanSijie'
where employee_id=100;
Oracle在对该SQL进行解析以后,找到employee_id为100的记录所在的数据块(假设为58号数据块),并找一个可用的undo数据块,将last_name列上被更新 前的旧值放入该undo数据块,然后在数据块头部分配一个ITL槽,在该ITL槽里存放当前的事务ID号、SCN号、所使用的undo数据块的地址,以及当前还未提交 的标记等信息。接下来,在58号数据块中,找到被更新的数据行,在其头部设置一个锁定标记,并在头部记录当前事务所使用的ITL槽的槽号。做完这些工作 以后,将控制权(也就是光标)返回给用户。该锁定标记说明当前用户在被修改的数据行上已经添加了X锁。
如果这时,另一个用户(假设为N)也对employee_id为100的记录进行修改,则其过程和上面描述的一样,只不过B在对数据行的头部设置锁定标记时,发现 该数据行头部已经有一个锁定标记了,说明该记录已经被添加了X锁,于是用户进程N必须等待,等待该X锁被释放。
可以看到,Oracle数据库是在物理层面上实现对数据行的锁定问题。而且锁定一条记录,并不影响其他用户对该记录的读取。比如,如果当前有一个用户( 假设为C)发出SQL语句,检索employee_id为100的记录信息,这时服务器进程发现被检索的记录有锁定标记,说明当前该记录已经被其他用户修改了,但是 还没提交。于是根据数据行头部记录的ITL槽的槽号,在数据块头部找到该ITL槽,并根据其中记录的undo数据块的地址,找到该undo数据块,将其中所保存 的改变前的旧值取出,并据此构建CR(Consistent Read一致性读)块,该CR块中的数据就是被更新的数据块(也就是58号数据块)在更新前的内容。于是根 据该CR块的内容,将用户所需要的信息返回给C。
对于Oracle数据库来说,行级锁只有X锁定模式,没有S锁定模式。Oracle的锁定总是尽可能地在最低级别上完成。比如更新数据行时,仅仅是锁定被更新的 数据行,并不会锁定同一个数据块中的其他数据行,也不会阻塞其他用户查询被更新的数据行。
2、表级锁(TM锁)
还是接着上面的例子,这时A用户已经发出了更新employee_id为100的记录的SQL语句。当A还没有提交之前,另外一个用户D发出下面的语句:
SQL> drop table employees;
由于用户A还没有提交所做的事务,因此该事务还没有结束,其他用户还不能删除该表,否则A所发出的事务就无法正常结束。为了阻止这时用户D的删除操作 ,我们能够想到的最直观的方法就是,在执行删除表的命令之前,先依次检查employees表里的每一条记录,查看每一条数据行的头部是否存在锁定标记,如 果是,则说明当前正有事务在更新该表,删除表的操作必须等待。
显然,这种方式会引起很大的性能问题,Oracle不会采用这种方式。实际上,当我们在对employees表的数据进行更新时,不仅会在数据行的头部记录行级锁 ,而且还会在表的级别上添加一个表级锁。那么当D用户要删除表时,发现employees表上具有一个表级锁,于是等待。
通过这种在表级别上添加锁定的方式,我们就能够比较容易并且高效地(因为不需要扫描表里的每一条记录来判断在表上是否有DML事务)对锁定进行管理了 。表级锁共具有五种模式,如下所示。
(1)行级排他锁(Row Exclusive,简称RX锁)
当我们进行DML时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修 改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。
(2)行级共享锁(Row Shared,简称RS锁)
通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希 望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不 允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。
(3)共享锁(Share,简称S锁)
通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加 RS锁。
(4)排他锁(Exclusive,简称X锁)
通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。
(5)共享行级排他锁(Share Row Exclusive,简称SRX锁)
通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。
这五种模式的TM锁的兼容关系如下表所示(√表示互相兼容的请求;×表示互相不兼容的请求;N/A表示没有锁定请求):

从前面的描述中可以看到,我们不仅可以通过发出DML语句的方式,由Oracle自动在表级别上添加TM锁。我们还可以通过发出lock table命令主动地在表级别 上添加TM锁,并在该命令中可以指定不同的锁定模式,其命令格式如下所示:
lock table  in [row share][row exclusive]
[share][share row exclusive][exclusive] mode;
对Oracle数据库中的各SQL语句所产生的表级锁的情况进行汇总,如下表所示:
对于通过lock table命令主动添加的锁定来说,如果要释放它们,只需要发出rollback命令即可。

转载于:https://blog.51cto.com/19880614/1187011

oracle教程之DML事务锁定的机制相关推荐

  1. oracle教程之解决DML事务锁定的冲突(二)

    2.检测并解决冲突 我们先执行下面的语句获得当前session的SID号,然后执行DML语句: SQL> select sid from v$mystat where rownum=1; SID ...

  2. Oracle教程之SGA_MAX_SIZE参数

    SGA_MAX_SIZE SGA_MAX_SIZE这个参数顾名思义,它用来控制SGA 使用虚拟内存 的最大大小,这里的虚拟内存的含义可能会有所模糊,先可以这样理解,就是Oracle 所能在内存中给SG ...

  3. oracle系统pga,oracle教程之PGA管理

    作为一个复杂的Oracle数据库系统来说,每时每刻都要处理不同用户所提交的SQL语句,获取数据并返回数据给用户.前面已经说到,解析SQL语句的工作是在Oracle实例中的shared pool所完成的 ...

  4. 怎样用pb链接oracle数据库,oracle教程之pb连接oracle数据库

    过ODBC或者PowerBuilder自带的DB PRofile或者专用接口连接上数据库,但仍然有许多使用者按此方法却无法连接上数据库,这方面的原因可能是PowerBuilder本身的原因,比如在安装 ...

  5. Oracle教程之oracle 给用户授权

    oracle 给用户授权_oracle 用户授权_oracle用户授权 grant(授权)命令 下面对创建的用户user01授权,命令如下: grant connect, resource to us ...

  6. oracle rollup 排序,Oracle教程之rollup用法

    在047考题中有以下这么一道考题 11.View the Exhibit and examine the descriptions of ORDER_ITEMS and ORDERS tables. ...

  7. oracle 设置 sga_max_size参数,Oracle教程之SGA_MAX_SIZE参数

    SGA_MAX_SIZE SGA_MAX_SIZE这个参数顾名思义,它用来控制SGA 使用虚拟内存 的最大大小,这里的虚拟内存的含义可能会有所模糊,先可以这样理解,就是Oracle 所能在内存中给SG ...

  8. 视频教程-Oracle从入门到精通全套视频教程之SQL与PLSQL(四)-Oracle

    Oracle从入门到精通全套视频教程之SQL与PLSQL(四) Oracle DBA,熟悉Unix操作系统,精通Oracle数据库. 曾任职某大型金融IT公司,负责银行领域数据库构建与运维,维护大量银 ...

  9. pgsql数据库默认配置事务类型_PostgreSQL基础教程之:初始化配置

    PostgreSQL基础教程之:初始化配置 时间:2020-04-27 来源: PostgreSQL基础教程之:初始化配置 一.配置pg_hba.conf 先说明客户端认证配置文件pg_hba.con ...

最新文章

  1. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
  2. python gif压缩_实用性视频转gif,压缩等常用文件工具处理及转换(含自写python工具)...
  3. Object/DataSet Relational Mapping(对象/数据集关系映射)完整版本下载
  4. asp.net 检测访问者是iphone,android,web(摘录)
  5. C 迭代器iterator的实现原理
  6. HTML5 基础知识
  7. SQLServer 维护脚本分享(05)内存(Memory)
  8. sql 通过游标 拆分xml结构
  9. Linux下 python调用讯飞离线语音合成(tts)
  10. Python爬取京东图书销量榜
  11. android 上层设置 自动调节亮度
  12. 神经网络和深度学习的简史
  13. 敏捷开发“松结对编程”实践之三:共同估算篇(大型研发团队,学习型团队,139团队,师徒制度,敏捷设计,估算扑克,扑克牌估算) .
  14. linux项目管理软件排名,好用的项目管理软件大排名
  15. “二手”市场的困境:用户习惯培养阶段
  16. python 操作excel2007
  17. 密码学小知识(5):唯密文攻击(COA)、已知明文攻击(KPA)、选择明文攻击(CPA),选择密文攻击(CCA)
  18. Ritzy Aspen酒店联手Indiegogo使用区块链出售房产
  19. Qt: QWidget::paintEngine: Should no longer be called
  20. 【历史上的今天】6 月 5 日:洛夫莱斯和巴贝奇相遇;公钥密码学先驱诞生;函数语言设计先驱出生

热门文章

  1. spring-boot的access日志格式修改
  2. IT培训“来offer”获得数千万融资
  3. WebMagic之优秀爬虫框架
  4. 技术分享连载(六十九)
  5. NodeJS是用来做什么的
  6. Java基础-流程控制
  7. [转]为什么我要用 Node.js? 案例逐一介绍
  8. sharepoint 中用自带的download.aspx实现文件的下载,中文文件名编码的问题
  9. Ubuntu中安装DiscuzX2
  10. shell脚本报错:[: =: unary operator expected