Oracle中锁的产生和解锁
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle中锁的产品和解锁
文档修改记录
版本号日期说明编写者审核者V1.0 20110822 初稿周伟明
1Oracle锁的介绍
在多进程或者多线程业务系统中,多个Oracle用户可以同时登录到一个Oracle数据库,对数据库中的数据进行操作难免会出现同时访问同一数据(表或者表中某一条记录)的情况,如果不对这种情况进行规范操作,数据的一致性和完整性就得不到保证,从而会出现意想不到的结果,所以必须有一种机制对并发访问进行控制和调度,避免造成数据更新不正确。
Oracle锁就是这样一种机制,它是控制并发操作最常用的方法。Oracle使用锁来防止进程相互之间发生的破坏性影响,当一个进程企图阻止另外一个进程对某条数据操作时,该进程就对这个数据进行锁,别的进程对这个数据操作之前,必须获得这个数据的解锁。
Oracle锁功能是Oracle DBMS自动完成的,不需要用户干预,但Oracle也提供了加锁的命令,供用户使用。
1.1 Oracle锁机制
Oracle自动使用不同锁类型来控制数据的并发操作,以防止用户之间的破坏性干扰。Oracle为一个事务自动锁一个资源,以防止其他事务对同一个资源的排他锁。当某种条件出现或者事务不再需要该资源时,锁自动解除。Oracle自动获取不同类型的锁取决于锁的资源及其所执行的操作。其中包括数据锁(DML)、字典锁(DDL)、内部锁、人工锁定、分布锁和并行缓冲管理锁。
1.1.1数据锁(DML)模式
数据锁保证表中数据在多个用户并发操作数据时保证数据的完整性,并防止相冲突的DML和DDL操作的破坏性干扰。
DML操作可在两个级别获取数据锁:行级锁(TX)和表级锁(TM)。
表级锁有以下几种方式
●空
Null,即无锁。
●行共享表锁(RS)
行共享表锁(有时也叫SS),表明事务保持已锁表行的表锁,并试图修改数据。
这种锁是在执行以下命令的时自动获取:
Select …From 表名… for update for …;
Lock Table 表名 in Row Share Mode;
当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或
者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。
Lock Table 表名 in Exclusive Mode;
●行排他表锁(RX)
行排他表锁(有时也叫SX)表示该事务对该资源有独占权利,通常是在修改记录
时发生这种锁。
该锁在执行以下命令的时候自动获取:
Insert Into 表名…;
Update 表名…;
Delete From 表名…;
Lock Table 表名 In Row Exclusive Mode;
当一个事务在一个表上持有行排他锁时,允许其他事务并行查询、插入、删除、修
改或者锁同一个表的其他行,但禁止其他事务使用下列命令进行并发锁:
Lock Table 表名 In Share Mode;
Lock Table 表名 In Share Row Exclusive Mode;
Lock Table 表名 In Exclusive Mode;
●共享表锁(S)
拥有共享表锁的事务允许其他事务查询该表,或用Select … For Update锁住指
定的行,和取得他们自己的Share Table锁(Lock Table In Share Mode),但其
他事务不能修改该表。
实现共享表锁使用如下命令:
Lock Table 表名 In Share Table;
但是禁止其他事务使用下列命令进行并发锁:
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 表名 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命令隐式地提交一个事务,当DDL事务需要时,由Oracle 自动获取字典锁,用户不能显式地请求DDL锁。
1.1.3内部锁模式
内部用户保证Oracle内部结构,而这些内部结构是不能访问的,所以用户无需对他们深入了解。
1.1.4死锁
死锁是多用户系统可能发生的一种现象,通常这种情况比较少,但是一般出现就比较致命。
当两个或者多个进程相互等待对方释放资源而没有一个进程可以继续的时候,就造成了死锁,具体如下:
实例1:
事务T1:
Update fundreal a
Set a.current_balane = a.current_balane + v_current_balane
Where 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_balane = a.current_balane + v_current_balane
Where a.fund_account = ‘100000’;
当T1事务在修改fundreal表记录的时候,T2事务在修改fundserialcounter表,而当T1事务在修改fundserialcounter表的时候,T2事务还没有释放,这时T2事务需要处理fundreal表,T1事务还没有释放,这样相互等待就出现了死锁。