全部博文(191)
分类: Oracle
2011-03-05 17:37:20
Latch和lock有许多不同之处。下表列出了latch和lock之间的比较结果。
Latch |
Lock | |
目的 |
只有一个目的:保证对内存结构的排他性访问(从oracle9i开始,cache buffers chain latch可以允许只读共享访问) |
两个目的:如果锁模式是兼容的,允许多个进程共享相同的资源;如果锁模型是不兼容的,保证对共享资源的排它性访问。 |
适用场景 |
只能应用于sga中的数据结构,保护内存对象。Latch只影响单次操作,而和事务无关。 |
保护数据库对象,诸如表,数据块和状态对象等。由应用程序驱动,控制对数据库中数据和元数据的访问。 Lock是事务性的。 |
获取方式 |
两种模式:willing-to-wait和no-wait |
六种模式:null, row share, row exclusive, share, share row exclusive和exclusive |
范围 |
信息都保存在内存中,并且只在本实例可见――latch是实例级别的 |
信息保存在数据库中,并且该数据库的所有实例都可见――lock是数据库级的 |
复杂度 |
使用简单机器指令比如:test-and-set, compare-and-swap或其他简单的cpu指令实现。由于cpu指令平台相关,所以latch在不同的平台的具体实现不一样。 轻量级的。 |
需要上下文切换(context siwtch),使用一系列指令实现。 重量级的。 |
持续事件 |
非常短暂(通常是微妙级的) |
通常在整个事务中都持有。 |
排队机制 |
当一个进程获取latch失败,转入睡眠状态时,他的请求不需要按顺序排队(一个例外情况:latch wait list latch需要排队)。 |
当一个进程获取lock失败,它的请求会进入一个队列,除非指定nowait。 |
死锁 |
Latch的实现方式不会产生死锁(不排队) |
Lock的排队机制可能导致死锁。死锁发生时会产生相应的跟踪文件。 |