Oracle中锁的产生和解锁

上传人:飞*** 文档编号:47746268 上传时间:2018-07-04 格式:PDF 页数:16 大小:308.67KB
返回 下载 相关 举报
Oracle中锁的产生和解锁_第1页
第1页 / 共16页
Oracle中锁的产生和解锁_第2页
第2页 / 共16页
Oracle中锁的产生和解锁_第3页
第3页 / 共16页
Oracle中锁的产生和解锁_第4页
第4页 / 共16页
Oracle中锁的产生和解锁_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Oracle中锁的产生和解锁》由会员分享,可在线阅读,更多相关《Oracle中锁的产生和解锁(16页珍藏版)》请在金锄头文库上搜索。

1、技术文档第 1 页 共 16 页Oracle 中锁的产品和解锁文档修改记录版本号日期说明编写者审核者V1.0 20110822 初稿周伟明1Oracle 锁的介绍在多进程或者多线程业务系统中,多个 Oracle 用户可以同时登录到一个Oracle 数据库,对数据库中的数据进行操作难免会出现同时访问同一数据(表或者表中某一条记录)的情况,如果不对这种情况进行规范操作,数据的一致性和完整性就得不到保证,从而会出现意想不到的结果,所以必须有一种机制对并发访问进行控制和调度,避免造成数据更新不正确。Oracle 锁就是这样一种机制,它是控制并发操作最常用的方法。Oracle 使用锁来防止进程相互之间发

2、生的破坏性影响,当一个进程企图阻止另外一个进程对某条数据操作时,该进程就对 这个数据进行锁,别的进程对这个数据操作之前,必须获得这个数据的解锁。Oracle 锁功能是Oracle DBMS 自动完成的,不需要用户干预,但Oracle 也提供了加锁的命令,供用户使用。1.1 Oracle 锁机制Oracle自动使用不同锁类型来控制数据的并发操作,以防止用户之间的破坏性干扰。Oracle为一个事务自动锁一个资源,以防止其他事务对同一个资源的排他锁。当某种条件出现或者事务不再需要该资源时,锁自动解除。Oracle自动获取不同类型的锁取决于锁的资源及其所执行的操作。其中包括数据锁(DML ) 、字典锁

3、( DDL ) 、内部锁、人工锁定、分布锁和并行缓冲管理锁。技术文档第 2 页 共 16 页1.1.1 数据锁( DML )模式数据锁保证表中数据在多个用户并发操作数据时保证数据的完整性,并防止相冲突的DML和 DDL操作的破坏性干扰。DML操作可在两个级别获取数据锁:行级锁(TX)和表级锁(TM ) 。表级锁有以下几种方式空Null ,即无锁。行共享表锁( RS )行共享表锁(有时也叫SS ) ,表明事务保持已锁表行的表锁,并试图修改数据。这种锁是在执行以下命令的时自动获取:Select From 表名 for update for ; Lock Table 表名 in Row Share

4、Mode; 当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。Lock Table 表名 in Exclusive Mode; 行排他表锁( RX )行排他表锁(有时也叫SX )表示该事务对该资源有独占权利,通常是在修改记录时发生这种锁。该锁在执行以下命令的时候自动获取:Insert Into 表名 ; Update 表名; Delete From 表名 ; Lock Table 表名 In Row Exclusive Mode; 当一个事务在一个表上持有行排他锁时,允许其他事务并行查询、插入、删除、修改或者锁同一

5、个表的其他行,但禁止其他事务使用下列命令进行并发锁:Lock Table 表名 In Share Mode; Lock Table 表名 In Share Row Exclusive Mode; Lock Table 表名 In Exclusive Mode; 共享表锁( S )技术文档第 3 页 共 16 页拥有共享表锁的事务允许其他事务查询该表,或用Select For Update锁住指定的行,和取得他们自己的Share Table锁( Lock Table In Share Mode) ,但其他事务不能修改该表。实现共享表锁使用如下命令:Lock Table 表名 In Share T

6、able; 但是禁止其他事务使用下列命令进行并发锁:Lock Table 表名 In Share Exclusive Mode; Lock Table 表名 In Row Exclusive Mode; Lock Table 表名 In Exclusive Mode; 共享行排他表锁(SRX )这种锁比共享锁具有更多限制,它只允许其他事务做查询,或用Select For Update 锁指定的行,但不允许修改表。实现共享行排他表锁使用如下命令:Lock Table 表名 In Share Row Exclusive Mode; 一旦表使用了这种锁,下列锁均不可使用:Lock Table 表名

7、In Share Mode; Lock Table 表名 In Share Row Exclusive Mode; Lock Table 表名 In Exclusive Mode; 排他表锁( X )排他表锁是最严格的方式,一个表只允许一个排他表锁存在,Exclusive允许持有锁的事务对该表读取操作,其他事务只可以查询操作,插入、删除、 修改等操作均不允许,也不允许取得任何形式的锁。实现排他表锁使用如下命令:Lock Table 表名 In Exclusive Mode; 1.1.2 字典锁( DDL )模式DDL锁保证模式对象(如表)的定义,DDL操作将影响对象;一个DDL命令隐式地提交一

8、个事务,当DDL事务需要时,由Oracle 自动获取字典锁,用户不能显式地请求DDL锁。技术文档第 4 页 共 16 页1.1.3 内部锁模式内部用户保证Oracle 内部结构,而这些内部结构是不能访问的,所以用户无需对他们深入了解。1.1.4 死锁死锁是多用户系统可能发生的一种现象,通常这种情况比较少,但是一般出现就比较致命。当两个或者多个进程相互等待对方释放资源而没有一个进程可以继续的时候,就造成了死锁,具体如下:实例 1:事务 T1:Update fundreal a Set a.current_balane = a.current_balane + v_current_balane W

9、here a.fund_account = 100000; Update fundserialcounter a Set a.serial_counter_value = a.serial_counter_value + 1; Where a.serial_counter_no = 1; 事务 T2:Update fundserialcounter a Set a.serial_counter_value = a.serial_counter_value + 1; Where a.serial_counter_no = 1; Update fundreal a Set a.current_ba

10、lane = a.current_balane + v_current_balane Where a.fund_account = 100000; 当 T1 事务在修改fundreal表记录的时候,T2 事务在修改fundserialcounter表,而当 T1 事务在修改fundserialcounter表的时候, T2 事务还没有释放,这时T2 事务需要处理 fundreal表, T1事务还没有释放,这样相互等待就出现了死锁。技术文档第 5 页 共 16 页实例 2:事务 T1:for cur_loop in (select a.* from fundreal a where a.fund

11、_account = 10000)loop Update fundreal a Set a.current_balane = a.current_balane + v_current_balane Where a.fund_account = cur_loop.fund_account And a.money_type = 0; Update fundserialcounter a Set a.serial_counter_value = a.serial_counter_value + 1; Where a.serial_counter_no = 1 And a.branch_no = cu

12、r_loop.branch_no; end loop; 事务 T2:Update fundreal a Set a.current_balane = a.current_balane + v_current_balane Where a.fund_account = 100001And a.money_type = 0; Update fundserialcounter a Set a.serial_counter_value = a.serial_counter_value + 1; Where a.serial_counter_no = 1 And a.branch_no = 1; 当 T

13、1 事务在修改fundreal表修改账号10000 的时候并且修改了表fundserialcounter的 branch_no 字段为 1 的数据, T2 事务在修改fundreal表修改账号100001 的时候,而当T1 事务在修改fundreal表账号 100001 的时候, T2 事务还没有释放fundreal,这时 T2 事务需要处理fundserialcounter表,T1 事务还没有释放fundserialcounter,这样相互等待就出现了死锁。技术文档第 6 页 共 16 页1.1.4.1死锁原理当 PMON (程序监控)后台进程检查到死锁之后,就会自动回滚导致死锁的命令,会产

14、生如下错误:ORA-00060: deadlock detected while waiting for resource. 并通知 PMON 首先检查到的哪一个进程发生了死锁(这是不能预测的) ,接收到死锁信息的进程必须决定释放回滚所做的其他修改,这样将使得另外一个进程继续下去,或者采取其他措施,如要求数据库管理员找到导致死锁的另外一个进程并进行杀死。例如: Alter System Kill Session Sid,Serial#; 2Oracle 锁的查询2.1 涉及系统对象2.1.1 V$LOCK 查看当前系统中所有锁定的情况,主要字段内容如下1.TYPE : 类型说明AD ASM D

15、isk AU Lock AF Advisor Framework AG Analytic Workspace Generation AK GES Deadlock Test AO MultiWriter Object Access AS Service Operations AT Alter Tablespace AW Analytic Workspace BR Backup/Restore CF Controlfile Transaction CI Cross-Instance Call Invocation CL Label Security cache CM ASM Instance E

16、nqueue CT Block Change Tracking CU Cursor DB DbsDriver DD ASM Local Disk Group DF Datafile Online in RAC 技术文档第 7 页 共 16 页DG ASM Disk Group Modification DI GES Internal DL Direct Loader Index Creation DM Database Mount/Open DN Diskgroup number generator DP LDAP Parameter DQ ASM RBAL doorbell DR Distributed Recovery DS Database Suspend DT Default Temporary Tablespace DV Diana Versioning DX Distributed Transaction E Library

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号