Oracle锁4:系统锁
Oracle数据库用了多种系统锁保护内部数据库和内存结构,这些机制对于用户来说是透明的。
闩(Latches)
闩是简单的、低级别的序列化机制,协调多个用户使用共享数据结构、对象和文件,闩在并行处理中保护共享内存资源,特别地,闩在下面的场景中保护数据结构:
1)被多个session并行修改;
2)当被一个session读的同时被另一个session修改;
3)当被访问时重新分配内存。
通常,在SGA中单个闩保护多个对象,例如,后台进程(例如DBWn和LGWR)从共享池(shared pool)分配内存创建数据结构,为了分配这些内存,这些进程用一个共享池闩防止两个进程同时检查或修改共享池。内存被分配后,其它进程可能需要访问共享池,例如库缓存(library cache),用于解析,这时,进程闩只锁库缓存,不锁整个共享池。
不像队列闩,例如行锁,闩不允许session排队。当一个闩成为可用时,发起请求的第一个session获取到闩。当一个进程在一个循环中重复地请求一个闩,叫做Latch spinning,而一个进程等待请求闩期间睡眠释放CPU,则叫做latch sleeping。
通常,一个Oracle进程在操作或查看一个数据结构时只获取闩极短的时间,例如,当处理一个雇员的薪水更新时,数据库可以获取和释放几千次锁。闩的实现依赖于操作系统,特别是对于怎么处理闩的等待。
闩的增加意味着并行度的减少,例如,排它硬解析操作会竞争库缓存闩。V$LATCH试图包含了每种闩使用的统计信息,包括每种闩被请求的次数和等待的时间。
互斥锁(Mutex)
互斥排它对象(互斥锁)是一个低级别的机制,用于防止一个内存对象在并发操作时过期或者腐化。互斥锁和闩类似,但通常闩保护一组对象,互斥锁则保护单个对象。
互斥锁通常用于:
1)减少竞争;
因为闩保护多个对象,当多个进程尝试并发的进入这多个对象的任意一个时,都会阻塞其它进程对其它对象的访问。而互斥锁减少了锁的范围,减少竞争。
2)互斥锁比闩花费更少的内存;
3)当使用共享模式时,一个互斥锁允许被多个session并行引用。
内部锁
内部锁是比闩和互斥锁更高级别、更复杂的机制,数据库使用那个下面几种类型的互斥锁:
字典缓存锁(Dictionary cache locks)
这些锁持续时间很短,当字典缓存的条目被修改或者使用时使用。它们保证被解析的语句看不到不一致的对象定义。字典缓存做能是共享的或者排它的,当解析完成时共享锁被释放,而当DDL操作完成时排它锁被释放。
文件和日志管理锁
这些锁保护各种文件,例如,一种内部锁保护控制文件(control file)以至于一次仅有一个进程能够改变它,另一种锁协调在线重做日志文件的使用和归档。数据文件被锁以确保多个实例在共享模式下装载一个数据库或者一个实例在排它模式装载一个数据库。因为文件和日志锁表示了文件的状态,这些锁不可避免是需要长时间持有的。
表空间和undo段锁
这些锁保护表空间和undo段。例如,一个数据库的所有实例对于一个表空间是在线还是下线必须保持一致。为了保证一次仅一个数据库能写入一个undo段,undo段必须加锁。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。