现在的位置: 首页 > 数据库 > 正文

Oracle锁类型简介

2014年11月02日 数据库 ⁄ 共 1282字 暂无评论 ⁄ 阅读 1,232 次

基础

  • 锁出现在多会话操作同一资源时,为保证事务的分离性(即各会话互不干扰),在多会话访问相同资源时,数据库系统会利用锁确保它们像队列一样依次进行。Oracle处理数据时用到的锁是自动获取的,我们也可以手动锁定数据。
  • Oracle有两种模式的锁,一种是排他锁(X锁,也可以叫写锁),一种是共享锁(S锁,也可以叫读锁)。
  • 对于排他锁,若事务A给数据数据添加此锁,则其他事务将不能对数据加任何锁,此时仅允许事务A对数据进行读写,直到事务完成将锁释放。对于共享锁,若事务A给数据添加此锁,则其他事务不能再加排他锁,只能加共享锁。
  • 锁是实现并发的主要手段,当事务提交后会自动释放锁。

锁的类型

Oracle的锁按作用对象不同可分为几种类型:DML锁(也称数据锁,用于保护数据)、DDL锁(保持模式中对象结构)和内部闩锁(保护数据库内部结构,完全自动调用)。

DML

  • 行级锁(TX):针对表中某行记录,是粒度最细的锁,属于排他锁。
  • 表级锁(TM):主要作用是防止修改表数据时,表的结构发生变化,此时不允许其他会话进行变更或删除操作。

在执行DML操作时,数据库会先申请数据对象上的共享锁,防止其他会话对该对象执行DDL操作。一旦申请成功,则会对将要修改的记录申请排他锁,如果此时其他会话正在修改该记录,那么等待其事务结束后再为修改的记录加排他锁。

表级锁模式

  • 行级共享锁(RS,ROW SHARE),该模式下不允许其他并行会话对该表使用排他锁,但允许其利用DML语句或lock命令锁定同一张表中的其他记录。SELECT … FROM … FOR UPDATE语句就是给记录加RS锁。
  • 行级排他锁(RX,ROW EXCLUSIVE),允许并行会话对同一表的其他数据进行修改,但不允许使用排他锁。
  • 共享锁(S,SHARE),不允许其他会话更新表,但允许对表添加RS锁。
  • 共享行级排他锁(RSX,SHARE ROW EXCLUSIVE),不允许并行会话对表进行DML操作,也不能加S锁。
  • 排他锁(X,EXCLUSIVE),其他并行会话不能进行DML和DDL操作,只能读表。

下表列出了5种模式之间的兼容关系,其中“对勾”表示兼容,“叉”表示不兼容。

lock1

下表为Oracle中各种SQL语句所产生的表级锁模式以及允许的锁定模式汇总:

lock2

DDL锁也可称为数据字典锁,主要作用是保护模式中对象的结构。当执行DDL操作时,首先Oracle会自动地隐式提交一次事务,然后自动地给处理对象加上锁。当DDL结束时,Oracle会隐式地提交事务并释放DDL锁。与DML不同的是,用户不能显式地要求使用DDL锁。DDL

DDL锁分类

  • 排他DDL锁(EXCLUSIVE DDL LOCK),对象加上该锁则不能被其他会话修改,也不能增加其他类型DDL锁。如果是表,此时可以读取数据。
  • 共享DDL锁(SHARED DDL LOCK),保护对象结构,其他会话不能修改该对象的结构但允许修改数据。
  • 可打破解析锁定(Breakable Parsed Lock),该类型锁可被打断,不能禁止DDL操作。

声明:该笔记转载自《Oracle从入门到精通》,仅用于个人学习,若侵犯到您的版权敬请告知!

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?