oracle的锁总结!

首先介绍一些锁的概念:

锁(lock)机制用于管理对共享资源的并发访问。

丢失更新:

(1) 会话Session1 中的一个事务获取(查询)一行数据,放入本地内存,并显示给一个最终用户User1。
(2) 会话Session2 中的另一个事务也获取这一行,但是将数据显示给另一个最终用户User2。
(3) User1 使用应用修改了这一行,让应用更新数据库并提交。会话Session1 的事务现在已经执行。
(4) User2 也修改这一行,让应用更新数据库并提交。会话Session2 的事务现在已经执行。

这个过程称为“丢失更新”,因为第(3)步所做的所有修改都会丢失。

悲观锁定:用户在屏幕上修改值之前,这个锁定方法就要起作用。悲观锁定(pessimistic locking)仅用于有状态(stateful)或有连接(connected)环境,也就是说,你的应用与数据库有一条连续的连接,而且至少在事务生存期中只有你一个人使用这条连接。

乐观锁定:即把所有锁定都延迟到即将执行更新之前才做。这种锁定方法在所有环境下都行得通,但是采用这种方法的话,执行更新的用户“失败”的可能性会加大。

阻塞:如果一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking)。

死锁:如果你有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁(deadlock)。

锁升级:出现锁升级(lock escalation)时,系统会降低锁的粒度。举例来说,数据库系统可以把一个表的100 个行级锁变成一个表级锁。Oracle 从来不会升级锁,但是它会执行锁转换(lock conversion)或锁提升(lock promotion),这些词通常会与锁升级混淆。

锁升级不是一个数据库“特性”。这不是我们想要的性质。如果数据库支持锁升级,就说明这个数据库的锁定机制中存在某些内部开销,而且管理数百个锁需要做大量的工作。在Oracle 中,1 个锁的开销与1 000 000 个锁是一样的,都没有开销。


Oracle 中主要有3 类锁,具体是:
DML 锁(DML lock): DML 代表数据操纵语言(Data Manipulation Language)。一般来讲,这表示SELECT、INSERT、UPDATE、MERGE 和DELETE 语句。DML 锁机制允许并发执行数据修改。例如,DML 锁可能是特定数据行上的锁,或者是锁定表中所有行的表级锁。
DDL 锁(DDL lock): DDL 代表数据定义语言(Data Definition Language),如CREATE 和ALTER 语句等。DDL 锁可以保护对象结构定义。

内部锁和闩:Oracle 使用这些锁来保护其内部数据结构。例如,Oracle 解析一个查询并生成优化的查询计划时,它会把库缓存“临时闩”,将计划放在那里,以供其他会话使用。闩( latch)是Oracle 采用的一种轻量级的低级串行化设备,功能上类似于锁。不要被“轻量级”这个词搞糊涂或蒙骗了,你会看到,闩是数据库中导致竞争的一个常见原因。轻量级指的是闩的实现,而不是闩的作用。


1、DML 锁

DML 锁(DML Lock)用于确保一次只有一个人能修改某一行,而且你正在处理一个表时别人不能删除这个表。在你工作时,Oracle 会透明程度不一地为你加这些锁。

TX 锁(事务锁):事务发起第一个修改时会得到TX 锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。

TM (DML Enqueue)锁:TM 锁(TM lock)用于确保在修改表的内容时,表的结构不会改变。尽管每个事务只能得到一个TX 锁,但是TM 锁则不同,修改了多少个对象,就能得到多少个TM 锁。


2、DDL 锁

在DDL 操作中会自动为对象加DDL 锁(DDL Lock),从而保护这些对象不会被其他会话所修改。实际上,通常会把DDL 语句包装在隐式提交(或提交/回滚对)中来执行这些工作。由于这个原因,在Oracle 中DDL 一定会提交。每条CREATE、ALTER 等语句实际上都如下执行(这里用伪代码来展示):

Begin
  Commit;
   DDL-STATEMENT
  Commit;
Exception
  When others then rollback;
End;
因此,DDL 总会提交(即使提交不成功也会如此)。DDL 一开始就提交,一定要知道这一点。它首先提交,因此如果必须回滚,它不会回滚你的事务。如果你执行了DDL,它会使你所执行的所有未执行的工作成为永久性的,即使DDL 不成功也会如此。

有3 种类型的DDL 锁:

排他DDL 锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL 锁或TM(DML)锁。这说明,在DDL 操作期间你可以查询一个表,但是无法以任何方式修改这个表。
共享DDL 锁(Share DDL lock):这些锁会保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。
可中断解析锁(Breakable parse locks):这些锁允许一个对象(如共享池中缓存的一个查询计划)向另外某个对象注册其依赖性。如果在被依赖的对象上执行DDL,Oracle 会查看已经对该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些锁是“可中断的”,它们不能防止DDL 出现。


3、闩(Latch)

闩(latch)是轻量级的串行化设备,用于协调对共享数据结构、对象和文件的多用户访问。

闩“自旋”:其逻辑是,尝试得到闩,如果失败,则递增未命中计数(miss count),这个统计结果可以在Statspack报告中看到,或者直接查询V$LATCH 视图也可以看到。一旦进程未命中,它就会循环一定的次数(有一个参数能控制这个次数,通常设置为2 000,但是这个参数在文档中未做说明),反复地试图得到闩。如果某次尝试成功,它就会返回,我们能继续处理。如果所有尝试都失败了,这个进程就会将该闩的睡眠计数(sleepcount)递增,然后睡眠很短的一段时间。醒来时,整个过程会再重复一遍。


4、用户定义锁

UL 是用户自定义的锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值