RAC 里面的锁机制

RAC 里面的锁机制
一般的锁lock,是用来控制并发的数据结构, 就是说如果有两个进程同时修改同一个数据, 为
了防止出现混乱和意外, 用锁来控制访问数据的次序。有锁的可以先访问,另外一个进程要等
到第一个释放了锁,才能拥有锁,继续访问。

总体来说,RAC里面的锁分两种, 一种是本地主机的进程之间的锁,另外一种是不同主机的进程
之间的锁。
本地锁机制
ORACLE的数据是按照数据块设计的, 每个用户session都会有一个代理进程来执行相应的数据
操作, 而这时候还会有其他的很多用户session, 也各自有自己的代理进程, 他们很可
能对同一个记录做改动。因为系统的记录有千百万条,所以正确的设计一个好的锁机制,
对于系统性能和维护是非常重要的, 否则稍不注意, 将会造成极大的性能浪费。

所以oracle在设计本地进程的锁的时候,采用了两种机制,一类叫做lock,另外一类叫做
latch.lock用来实现我们常见的大部分数据的保护, 比如记录的行级锁, 而latch一般在遍历
某些数据链表的时候用来保护这些关键数据。

这样分类和锁的效率有关, 因为一般的锁非常的耗时,好很长时间才能释放,可能要耗费成百
上千个硬件操作,所以oracle专门针对需要短时间的数据保护设计了一种特别的锁,叫
latch,只要几个硬件操作就可以完成。用来对某些特别的数据结构的保护。

常见的lock是行级锁, 原理比较简单,就是针对每个事务,在每个数据块的头上,记录上这个
事务号的详细信息,然后在数据快里面的每个记录后面,也记录一下这个事务的编号,
这样当下一个事务到来的时候, 他也在数据块的头上,记录了自己的信息, 但是他查看到这
个记录的时候,发现已经有别的事务抢先了, 不可进行操作, 只能把针对这个记录的修
改排到队列里面, 等待后面完成。

  不同主机间的锁机制

在不同主机间的锁,oracle采用了DLM(Distributed Lock Management)机制, 这里就有一个粒
度的问题,如何设计锁的粒度,让性能达到最优?

我们知道,在ORACLE RAC里面,数据是全局共享的, 就是说每个进程看到的数据块都是一样
的,在不同机器间,数据块可以传递。DLM 设计的这个锁的粒度就往上调了一级,到了数
据块级别, 而不是行级, 因为在多个机器间共享行级锁实在是太耗费资源了

针对不同类型的数据块, 比如某些metadata 或者很少改动的数据块, 和另外那些包含数据记
录内容的数据块, DLM的操作机制也是不一样的。

如果是metadata,那么RAC的每个锁进程在锁定本地数据块的时候,发一个广播信息给其他的节
点,告诉他们对应的锁,通过广播机制实现不同主机之间的内容同步。

对于数据块, 有通过一个GRD 的表格, 这个表格里面记录的所有的数据块在各个机器上的分
布,和当前谁有最新的版本,如果有某个主机对其进行了修改,需要通过这个GRD表做个更
新,别的主机进程如果也需要改动这个数据块,就从GRD里面查谁有最新的版本,然后要求前面的主
机把这个数据块传送过来,再做改动, 最后需要把改动同步到磁盘上, 保证一至性。

你可能感兴趣的:(数据结构,oracle)