您的位置:首页 > 职场人生

2010-11-22 11:22 85 查看
:锁机制用于管理对共享资源的并发访问。

必要性:数据库中使用锁为了支持对共享资源的并发访问,与此同时还提供对数据的完整性和一致性。

阻塞:如果一个会话持有某个资源,另一个资源在请求这个资源,就会出现阻塞(blocking)。这样一来,请求的会话会被阻塞,直至持有锁的会话放弃锁定的资源。
问题:丢失更新,A持有会话,B请求这个资源并更新X字段,C同时也请求这个资源并更新X字段,当A放弃对这个资源的锁时,B、C就会相继运行,B所更新的字段就会被C覆盖,造成丢失更新。(注:因为A持有锁的时候,B、C所能更新的是相同的值)
原因:应用逻辑问题是阻塞的根源所在,所以几乎所有的阻塞都是可以避免的。

死锁:如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁。
比如:如果数据库中有两个表A和B,每个表中都只有一行,打开两个会话A和B,在会话A中更新A表,并在会话B中更新B表
如果此时我想在会话B中更新A表就会出现阻塞。(因为会话A已经锁定这一行,此时如果会话A提交或者回滚,会话B就会继续执行)
如果再回到会话A中试图更新表B,就会导致一个死锁。(这样就必须在两个会话中选择一个"牺牲品"让它回滚)

锁类型
DML锁(DML lock):DML代表数据操纵语言(Data Manipulation Language)。一般来讲,这表示 SELECT、INSERT、UPDATE、MERGE 和 DELETE 语句。DML 锁机制允许并发执行数据修改。例如,DML锁可能是特定数据行上的锁,或者是锁定表中所有行的表级锁。用于确保一次只有一个人能修改某一行,而且你正在处理一个表时别人不能删除这个表。在你工作时,Oracle 会透明程度不一地为你加这些锁。
1.TX锁(事务锁)
事务发起第一个修改时会得到 TX 锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK) 。TX锁用作一种排队机制,使得其他会话可以等待这个事务执行。
2.TM (DML Enqueue)锁
TM锁(TM lock)用于确保在修改表的内容时,表的结构不会改变。例如,如果你已经更新了一个表,会得到这个表的一个 TM 锁。这会防止另一个用户在该表上执行 DROP 或 ALTER 命令。

DDL锁(DDL lock):DDL代表数据定义语言(Data Definition Language),如CREATE 和ALTER 语句等。DDL锁可以保护对象结构定义。在 DDL 操作中会自动为对象加 DDL 锁(DDL Lock) ,从而保护这些对象不会被其他会话所修改。例如,如果我执行一个DDL 操作ALTERTABLE T,表T上就会加一个排他DDL锁,以防止其他会话得到这个表的DDL 锁和TM 锁。 在DDL语句执行期间会一直持有DDL锁, 一旦操作执行就立即释放DDL锁。
1.排他DDL锁 (Exclusive DDL lock)
这会防止其他会话得到它们自己的DDL锁或 TM (DML)锁。这说明,在DDL操作期间你可以查询一个表,但是无法以任何方式修改这个表。
2.共享DDL锁(Share DDL lock)
这些锁会保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。
3.可中断解析锁(Breakable parse locks)
这些锁允许一个对象(如共享池中缓存的一个查询计划)向另外某个对象注册其依赖性。如果在被依赖的对象上执行DDL,Oracle会查看已经对该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些锁是“可中断的”,它们不能防止DDL出现。

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

简单概括oracle锁:
TX锁:修改数据的事务在执行期间会获得这种锁。
TM 锁和 DDL 锁:在你修改一个对象的内容(对于 TM 锁)或对象本身(对应 DDL 锁)时,这些锁可以确保对象的结构不被修改。
闩(latch) :这是Oracle的内部锁,用来协调对其共享数据结构的访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲