Oracle数据库中闩锁和互斥锁的深入解析
1. 闩锁和互斥锁概述
在Oracle数据库中,为了防止两个会话同时不一致地修改表中的同一数据,存在着锁定机制。而闩锁(Latches)和互斥锁(Mutexes)则有着类似的功能,不过它们保护的是共享内存(System Global Area,SGA)中的数据,而非表中的数据。
在Oracle 10g第2版之前,Oracle使用闩锁来进行所有共享内存的同步。在10g第2版中,互斥锁(一种轻量级的闩锁变体)取代了部分闩锁的功能。在后续内容中,除非特别说明,“闩锁”一词将同时指代闩锁和互斥锁。
1.1 闩锁和互斥锁的作用
Oracle会话在进行几乎所有数据库操作时,都需要对SGA进行更新或读取。闩锁和互斥锁的作用就是防止这些操作相互干扰,从而可能导致SGA数据损坏。具体操作如下:
- 缓存数据存储 :当会话从数据库文件读取数据时,通常会将数据块存储到SGA的缓冲区缓存中,添加新数据块时需要闩锁。
- 缓存数据读取 :如果数据块已存在于缓冲区缓存中,会话将直接从这里读取,而不是从磁盘读取。在访问时,闩锁会在短时间内“锁定”缓冲区。
- SQL语句解析 :当解析新的SQL语句时,它会被添加到SGA内的库缓存中,闩锁或互斥锁可防止两个会话同时添加或更改相同的SQL。
- 重做日志写入 :对数据块进行修改时,在写入重做日志之前,会先将条目放入重做缓冲区,对重做缓冲区的访问由闩锁保护。