一、基本概念
1、mnesia的锁不是操作系统级别的锁;
2、一个mnesia结点中,所有的锁由单独的mnesia_locker进程进行管理;
3、其它进程对锁的申请和释放通过发送消息到mnesia_locker进程实现;
4、A进程请求锁时,发送的同步消息如果当时获取到了锁,则返回获取到的锁消息;如果没有,则将锁请求加入等待队列,A进程阻塞等待返回;
5、B进程进行释放锁时,发送同步消息给mnesia_locker进程,检查等待队列,让其中满足条件的锁请求返回,返回给原来获取锁请求的A进程成功消息,A进程成功获得锁;
6、集群中,写锁需要对所有结点进行加锁后才返回;
二、数据结构
锁管理器一共有四张锁表(ets表):
1、mnesia_held_locks:表锁或行锁
记录数据为 {Oid, Op, [ {Op2, Tid2} | {Op1, Tid1}]}
Oid = {Table,Key} Op = read | write (如果请求锁的都是读则为read,有写则为write) Tid申请的id
mnesia_tid_locks:一个事务涉及的所有锁
mnesia_sticky_locks:粘着锁
mnesia_lock_queue:排队锁请求