`

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中锁的类型

 

分享到:
评论

相关推荐

    基于C_C++与ORACLE9i的嵌入式SQL编程技术.doc

    基于C_C++与ORACLE9i的嵌入式SQL编程技术

    Oracle 9i&10g 编程艺术

    Oracle 9i&10g 编程艺术 oracle 数据库开发方面的经典技术书籍

    oracle9i 实用技术

    oracle9i 实用技术 中文版 包括安装编程备份维护等

    Oracle 9i&10g编程艺术:深入数据库体系结构 pdf

    高清淅的一本 ORACLE数据库教程的书籍,阅读此书,你将了解到Oracle数据库应用设计的一些重要概念。如果你确实领会了这些思想,相信你肯定也会对所面对的难题“换角度思考”。  IBM的Watson曾经说过:“自始以来,...

    Oracle 9i中文版基础培训教程

    本书是一本专门针对Oracle 9i数据库技术的基础培训教程。全书精心组织Oracle 9i数据库初学者需要掌握的知识,循序渐进... 本书可作为Oracle9i数据库技术专业培训的教材,也适合初学者自学或作为日常管理工作的参考书。

    基于C_C 与ORACLE9i的嵌入式SQL编程技术.pdf

    基于C_C 与ORACLE9i的嵌入式SQL编程技术.pdf

    oracle 9i中文版基础培训教程

    本书是一本专门针对Oracle 9i数据库技术的基础培训教程。全书精心组织Oracle 9i数据库初学者需要掌握的知识,循序渐进... 本书可作为Oracle9i数据库技术专业培训的教材,也适合初学者自学或作为日常管理工作的参考书。

    Oracle-Database-9i10g11g编程艺术-深入数据库体系结构(第2版)

    oracle数据库开发技术,不是很全,适合入门或中级开发人员学习,DBA也是适合的,如果你不是高手

    基于C_C_与ORACLE9i的嵌入式SQL编程技术.pdf

    用于C及SQL应用,是一个基于C_C_与ORACLE9i的嵌入式SQL编程技术的pdf

    Oracle 9i中文版基础培训教程.part1

    本书是一本专门针对Oracle 9i数据库技术的基础培训教程。全书精心组织Oracle 9i数据库初学者需要掌握的知识,循序渐进... 本书可作为Oracle9i数据库技术专业培训的教材,也适合初学者自学或作为日常管理工作的参考书。

    Oracle 9i中文版基础培训教程.part2

    本书是一本专门针对Oracle 9i数据库技术的基础培训教程。全书精心组织Oracle 9i数据库初学者需要掌握的知识,循序渐进... 本书可作为Oracle9i数据库技术专业培训的教材,也适合初学者自学或作为日常管理工作的参考书。

    Oracle 9i10g编程艺术

    本书是一本有关Oracle 9i和10g体系结构数据库的权威书籍,涵盖了所有最重要的Oracle体系结构特性,包括文件、内存结构和进程,锁和锁存,事务、并发和多版本,表和索引,数据类型,以及分区和并行,并充分利用具体的...

    Oracle 9i 10g编程艺术深入体系结构 中文版

    无论你是程序员还是dba,要创建和管理稳定、高质量的oracle系统,归根结底都需要理解oracle数据库的体系结构。  本书是讲述oracle数据库毋庸置疑的权威指南,凝聚了世界顶尖的oracle专家thomas kyte数十年的宝贵...

Global site tag (gtag.js) - Google Analytics