`
renzhelife
  • 浏览: 668722 次
文章分类
社区版块
存档分类
最新评论

对锁的理解(转载)

 
阅读更多

关于锁的几种类型和相关参数

设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性。Oracle数据库封锁方式有三种:共享封锁,独占封锁,共享更新封锁
  封锁类型
  Oracle RDBMS的封锁类型可分为如下三类:
  1、内部级封锁
  内部级封锁是用于保护ORACLE内部结构,由系统内部实现,用户不能访问。
  2、DDL级封锁(字典/语法分析封锁)
  DDL级封锁也是由ORACLE RDBMS来控制,它用于保护数据字典和数据定义改变时的一致性和完整性。它是系统在对SQL定义语句作语法分析时自动地加锁,无需用户干予。字典/语法分析封锁共分三类:
  (1)、字典操作锁:用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时刻仅能对一个字典操作。
  (2)、字典定义锁:用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同时改动某个表的结构。
  (3)、表定义锁:用于一个SQL语句正当访问某个表时,防止字典中与该表有关的项目被修改。
  3、DML级封锁
  DML级封锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性,其封锁对象可以是表或行。
  对用户的数据操纵,Oracle可以自动为操纵的数据进行封锁,但如果有操纵授权,则为满足并发操纵的需要另外实施封锁。DML封锁可由一个用户进程以显式的方式加锁,也可通过某些SQL语句隐含方式实现。
  DML锁有如下三种封锁方式:
  (1)、共享封锁方式(SHARE)
  (2)、独占封锁方式(EXCLUSIVE)
  (3)、共享更新封锁(SHARE UPDATE)
  其中SHARE,EXCLUSIVE用于表封锁,SHARE UPDATE用于行封锁。
  1、共享方式的表封锁
  共享方式的表封锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其它用户对已封锁的表进行更更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的封锁,共享更新锁可以再施加,但不允许持有共享更新封锁的进程做更新。共享该表的所有用户只能查询表中的数据,但不能更新。共享方式的表封锁只能由用户用SQL语句来设置,基语句格式如下:
  LOCK TABLE <表名>[,<表名>]...
  IN SHARE MODE [NOWAIT]
  执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择项NOWAIT,若该封锁暂时不能施加成功,则返回并由用户决定是进行等待,还是先去执行别的语句。
  持有共享锁的事务,在出现如下之一的条件时,便释放其共享锁:
  A、执行COMMIT或ROLLBACK语句。
  B、退出数据库(LOG OFF)。
  C、程序停止运行。
  共享方式表封锁常用于一致性查询过程,即在查询数据期间表中的数据不发生改变。
  2、独占方式表封锁
  独占方式表封锁是用于封锁表中的所有数据,拥有该独占方式表封锁的用户,即可以查询该表,又可以更新该表,其它的用户不能再对该表施加任何封锁(包括共享、独占或共享更新封锁)。其它用户虽然不能更新该表,但可以查询该表。
  独占方式的表封锁可通过如下的SQL语句来显示地获得:
  LOCK TABLE <表名>[,<表名>]....
  IN EXCLUSIVE MODE [NOWAIT]
  独占方式的表封锁也可以在用户执行DML语句INSERT、UPDATE、DELETE时隐含获得。
  拥有独占方式表封锁的事务,在出现如下条件之一时,便释放该封锁:
  (1)、执行COMMIT或ROLLBACK语句。
  (2)、退出数据库(LOG OFF)
  (3)、程序停止运行。
  独占方式封锁通常用于更新数据,当某个更新事务涉及多个表时,可减少发生死锁。
  3、共享更新封锁方式
  共享更新封锁是对一个表的一行或多行进行封锁,因而也称作行级封锁。表级封锁虽然保证了数据的一致性,但却减弱了操作数据的并行性。行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。
  可通过如下的两种方式来获得行级封锁:
  (1)、执行如下的SQL封锁语句,以显示的方式获得:
  LOCK TABLE <表名>[,<表名>]....
  IN SHARE UPDATE MODE [NOWAIT]
  (2)、用如下的SELECT ...FOR UPDATE语句获得:
  SELECT <列名>[,<列名>]...
  FROM <表名>
  WHERE <条件>
  FOR UPDATE OF <列名>[,<列名>].....[NOWAIT]
  一旦用户对某个行施加了行级封锁,则该用户可以查询也可以更新被封锁的数据行,其它用户只能查询但不能更新被封锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式封锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。
  当出现如下之一的条件,便释放共享更新锁:
  (1)、执行提交(COMMIT)语句;
  (2)、退出数据库(LOG OFF)
  (3)、程序停止运行。
  执行ROLLBACK操作不能释放行锁。
  从上面讲述可见,ORACLE RDBMS的加锁机制,解决了并发事务的相容与互斥问题。相容保证事务的并发性,互斥确保数据的一致性。不同用户锁的相容与互斥关系由下图给出。
  其中最后一行最后一列为其它用户提供在不同行上设置SHARE UPDATE锁。但当用户1在某行上进行更新操作时,用户2只有等待用户1提交事务后,才能更新自己所封锁的行。
  中最后一行最后一列为其它用户提供在不同行上设置SHARE UPDATE锁。但当用户1在某行上进行更新操作时,用户2只有等待用户1提交事务后,才能更新自己所封锁的行。

  死锁
  封锁虽然能够有效的解决并发操作,但是任何资源的独占都会有死锁的危险。例如:有两个事务T1,T2,T1对数据A施加独占封锁,T2对数据B施加了独占封锁。再假设T1要对数据B加锁,由于B已被T2独占封锁,因此T1置于等待状态,等待B被释放;现在若T2也要对A进行封锁,由于A已被T1独占封锁,因此T2也被置于等待状态。这样就形成了两个事务相互等待的状态,而且永远不能结束,此种情况称为死锁。
  在Oracle系统中能自动发现死锁,并选择代价最小的,即完成工作量最少的事务予以撤消,释放该事务所拥有的全部锁,使其它的事务继续工作下去。
  从系统性能上考虑,应该尽可能减少资源竞争,增大吞吐量,因此用户在给并发操作加锁时,应注意以下几点:
  1、对于UPDATE和DELETE操作,应只封锁要做改动的行,在完成修改后立即提交。
  2、当多个事务正利用共享更新的方式进行更新,则不要使用共享封锁,而应采用共享更新封锁,这样其它用户就能使用行级锁,以增加并行性。
  3、尽可能将对一个表的操作的并发事务施加共享更新锁,从而可提高并行性。
  4、在应用负荷较高的期间,不宜对基础数据结构(表、索引、簇和视图)进行修改
10 察看表锁
select
s.sid sid,
s.username username,
s.machine machine,
l.type type,
o.object_name object_name,
DECODE(l.lmode,
0,'None',
1,'Null',
2,'Row Share',
3,'Row Exlusive',
4,'Share',
5,'Sh/Row Exlusive',
6,'Exclusive') lmode,
DECODE(l.request,
0,'None',
1,'Null',
2,'Row Share',
3,'Row Exlusive', a
4,'Share',
5,'Sh/Row Exlusive',
6,'Exclusive') request,
l.block block
from
v$lock l,
v$session s,
dba_objects o
where
l.sid = s.sid
and
username != 'SYSTEM'
and
o.object_id(+) = l.id1;
===================================================================
表1 Oracle的TM锁类型
锁模式 锁描述 解释
0 none
1 NULL 空 SQL操作:Select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行
SQL操作:Select for update、Lock for update、Lock row share

3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作
SQL操作:Insert、Update、Delete、Lock row share

4 S(Share) 共享锁
SQL操作:Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁
SQL操作:Lock share row exclusive
6 X(Exclusive) 排它锁
SQL操作:Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

表2 数据字典视图说明
视图名 描述 主要字段说明
v$session 查询会话的信息和锁的信息。
sid,serial#:表示会话信息。
program:表示会话的应用程序信息。
row_wait_obj#:表示等待的对象。和dba_objects中的object_id相对应。

v$session_wait 查询等待的会话信息。
sid:表示持有锁的会话信息。
Seconds_in_wait:表示等待持续的时间信息.
Event:表示会话等待的事件。

v$lock 列出系统中的所有的锁。
Sid:表示持有锁的会话信息。
Type:表示锁的类型。值包括TM和TX等。
ID1:表示锁的对象标识。
lmode,request:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。

dba_locks 对v$lock的格式化视图。
Session_id:和v$lock中的Sid对应。
Lock_type:和v$lock中的type对应。
Lock_ID1: 和v$lock中的ID1对应。
Mode_held,mode_requested:和v$lock中的lmode,request相对应。
v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。
Xidusn,xidslot,xidsqn:表示回滚段信息。和v$transaction相关联。
Object_id:表示被锁对象标识。
Session_id:表示持有锁的会话信息。
Locked_mode:表示会话等待的锁模式的信息,和v$lock中的lmode一致。

分享到:
评论

相关推荐

    大气压力变化对锁风启封火区气体积聚的影响规律

    为研究大气压力变化对锁风启封火区内气体积聚的影响,探索合理的启封时机,降低火区启封工作中的危险性。在大气压力对火区内气体运移作用机理的基础上,运用Fluent软件对锁风启封前、启封后的封闭火区内的气体状态进行...

    电子政务-一种采用对锁连接结构的分离式电动床.zip

    电子政务-一种采用对锁连接结构的分离式电动床.zip

    Java Core Sprout:基础、并发、算法

    对锁的一些认知 ReentrantLock实现原理 ConcurrentHashMap 的实现原理 如何优雅地使用和理解线程池 深入理解线程通信 一个线程召集的诡异事件 线程池中你不可错过的一些细节 『ARM包入坑指北』之队列

    激光陀螺中的光学抖动及其对锁区的影响分析 (2010年)

    研究了环形光路中背向散射对锁区的影响,理想状态下可以消除陀螺的零阶锁区。在微扰条件下对光学抖动下陀螺腔内的光路变化进行了分析计算,得到了使陀螺锁区达到最佳改善的理论光学抖动量并进行了实验研究。实验结果...

    干燥工艺对锁掷酵母中类胡萝卜素的影响 (2015年)

    以玉米浆为培养基生产锁掷酵母,对干燥后锁掷酵母的质量进行研究,比较不同干燥方式对锁掷酵母中类胡萝卜素以及干酵母粉亮度值L、红色值a、黄色值b的影响。结果表明:冷冻干燥能较好地保持锁掷酵母中的类胡萝卜素,并且...

    关于多线程常用方法以及对锁的控制(详解)

    下面小编就为大家带来一篇关于多线程常用方法以及对锁的控制(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java中的各种锁详细介绍.docx

    本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。 Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的...

    免费开源!!Java Core Sprout:基础、并发、算法

    对锁的一些认知 ReentrantLock实现原理 ConcurrentHashMap 的实现原理 如何优雅地使用和理解线程池 深入理解线程通信 一个线程召集的诡异事件 线程池中你不可错过的一些细节 『ARM包入坑指北』之队列

    浅谈Java虚拟机对内部锁的四种优化方式

    主要介绍了浅谈Java虚拟机对内部锁的四种优化方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    锁相调频发射机的设计

    利用仿真软件,进行了对锁相调频发射机的设计

    谈谈iOS中的几种锁

    闲话少说,这里简单对锁来个简单介绍分享。 2 目录 第一部分:什么是锁 第二部分:锁的分类 第三部分:锁的作用 第四部分:iOS中锁的实现 第一部分:什么是锁 从小就知道锁,就是家里门上的那个锁,用来防止...

    盈汇宝智能交易系统精英版

    1、适用于有交易技术基础的人士已及各类金融投资理财机构。 2、仅限使用MT4平台的外汇及黄金交易用户。 ... 4、仅限正规外汇平台用户(推荐使用锐利外汇网代理的IFX/FXsolutions...5、仅适用于允许对锁开仓的交易平台。

    Hibernate乐观锁

    学习hibernate的必备知识,当你学习hibernate时,就会对锁的概念有一定的了解了.

    不可不说的Java“锁”事

    本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的...

    基于51单片机的密码锁

    在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、...为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作、记住密码即可开锁等优点。

    电子设计竞赛题目“电子密码锁”

    在日常生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人...为满足人们对锁的使用要求,增加其安全性, 用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。

    Java-Interview:此项目为 Java 面试的汇总,多数是一些 Java 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题

    对锁的一些认知 ReentrantLock 实现原理 ConcurrentHashMap 的实现原理 线程池原理 深入理解线程通信 交替打印奇偶数 JVM Java 运行时内存划分 类加载机制 OOM 分析 垃圾回收 对象的创建与内存分配 你应该知道的 ...

    java-interview

    对锁的一些认知 ReentrantLock 实现原理 ConcurrentHashMap 的实现原理 线程池原理 深入理解线程通信 交替打印奇偶数 JVM Java 运行时内存划分 类加载机制 OOM 分析 垃圾回收 对象的创建与内存分配 你应该知道的 ...

    Java-Interview:https

    对锁的一些认知 ReentrantLock 实现原理 ConcurrentHashMap 的实现原理 线程池原理 深入理解线程通信 交替打印奇偶数 JVM Java 运行时内存划分 类加载机制 OOM 分析 垃圾回收 对象的创建与内存分配 你应该知道的 ...

    并发编程实战和原理讲解

    该课程主要讲解并发的意义和并发实战,课程中会有对锁的应用和解析,以及实际应用中的应用场景讲解。冲实际场景出发,真实的应用和推理解决方案。学习完成之后能够掌握线程安全、线程和线程池的基本概念 掌握核心...

Global site tag (gtag.js) - Google Analytics