Oracle 9i 编程技术-- 锁

在日常生活中,我们都需要使用各种不同的锁来保护自己的私人财产,以免遭到损失.而在ORACLE中,同样也需要使用锁这个机制来保护数据库中的数据.

那么,下面就复习一下ORACLE中锁机制的各个部分.


1.锁在ORACLE中的解释

ORACLE中的锁机制是为了在数据库并发访问中,用于保护和管理共享资源的正确性,完整性与一致性.在这里提到的共享资源包含数据库中的表,索引,视图等等...


2.用户很迷惑,为什么我更新的信息不见了?(更新丢失) 在没有实现锁机制的一些应用中,都会发生这种情况,就是用户在修改了应用的一些信息后,例如:地址,email... 回头查看自己修改的信息时,发现自己修改的信息没有发生任何的更新.这种让用户感到很困惑的情况,就是我们所说的"更新丢失". 下面就用一个例子来说明这个问题:

a.会话SESSION 1 中的一个事务获取一行数据,放在本地内存,并显示给一个最终用户U1.

b.会话SESSION 2 中的另一个事务也获取这一行,但将数据显示给另一个用户U2

c.U1使用应用修改了该行的数据,并提交给数据库.

d.之后U2也修改了该行,并也提交了数据库;这时,U2的数据将会覆盖了U1的更新,这时候丢失更新就发生了. 下面将会提到解决丢失更新的方式.


3.处理更新丢失的方式(乐观锁定&悲观锁定)

为了解决更新丢失这种情况,ORACLE提出了两个解决方式:乐观锁&悲观锁. 从它们的名称可以初步了解到它们在粒度,严重性上有明显的区别.

乐观锁定:顾名思义就是用一种乐观的态度去看代丢失更新的问题,它主观认为同一时间点中只有它自己一个会话在修改当前的记录,只有当它真正提交了修改中,才将它本身修改的数据进行锁定,这个时候ORACLE就会采用一些方法去检查这些数据是否已经被其他会话更新过,如果很不幸,发现用户希望修改的数据已经被其他用户更新过,那么ORACLE就会根据应用程序的逻辑进行处理。

悲观锁定:  用一些通俗的话说,就是用户很担心他在修改数据的时候有人动了他想修改的东西,所以他在查询数据的时候就马上把数据给锁了起来,在同一时刻,只要他还没有提交更新,那么就只有一个人能访问到这些数据。达到独享数据的的目的。

所以悲观与乐观的区别就在于它们锁定数据的时间点不同,一个早,一个晚。。。


4.悲观锁定与乐观锁定的几种实现方式

悲观锁定的实现需要建立一个有状态的链接,而悲观锁定有两种实现的方式,一种是SELECT ... FOR UPDATE,另一种是SELECT ... FOR UPDATE NOWAIT,下面通过一个例子来介绍它们的区别。

首先我们使用ORACLE中scott.dept表作为我们的实例。

在会话一中我们使用这样一个查询语句

select DEPTNO,DNAME from dept FOR UPDATE 

 

此时,如果在另一个会话中使用与上面相同的查询语句查询dept表,将会发现该查询语句好像被锁定了一样,记录无法查询出来。只有当第一个会话提交或回滚了事务,该查询才能被解开。这就是FOR UPDATE得作用,它将数据以悲观的方式锁定起来,其他想操纵这些数据的会话只能一直处于等待的状态。这种方式的缺点在于,会话长时间锁定在等待数据中,造成大量资源的浪费;而使用FOR UPDATE NOWAIT的方式检索数据,当发现数据已被session锁定时,其他会话会直接返回一个ORACLE的错误,而不再处于长时间的等待中。

SESSION1: SELECT DEPTNO,DNAMR FOR UPDATE NOWAIT. 

当SESSION1已经对数据锁定时,如果SESSION2也采用 

SESSION2:SELECT DEPTNO,DNAME FOR UPDATE NOWAIT. 
ORACLE将会返回 ORA-00054:资源正忙,要求指定NOTWAIT 

 


总之,Oracle中的悲观锁就是利用Oracle的Connection对数据进行锁定。在Oracle中,用这种行级锁带来的性能损失是很小的。而且由于数据的及时锁定,在数据提交时候就不会出现冲突,可以省去很多恼人的数据冲突处理。缺点就是你必须要始终有一条数据库连接,就是说在整个锁定到最后放开锁的过程中,你的数据库联接要始终保持住。与悲观锁相对的,我们有了乐观锁。乐观锁一开始也说了,就是一开始假设不会造成数据冲突,在最后提交的时候再进行数据冲突检测。在乐观锁中,我们有3种常用的做法来实现。


A.第一种方式是在检索数据的同时将数据拷贝一份到应用中,待修改完成后,再将数据与数据库中的数据进行对比,这种处理的方式完全由应用程序所处理。


5.锁定而导致的后果--阻塞

6.阻塞的几种形式

7.死锁

8.ORACLE中锁的类型

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值