一、基本概念
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:排隊鎖請求