----------------------------------------------
谓词锁
本节内容介绍谓词锁相关的结构体以及他们之间的关系,谓词锁相关的结构体之间的关系可参见图X-XX。
图X-XX 谓词锁相关数据结构图
SIReadLocks(谓词锁)
PostgreSQL使用“PREDICATELOCKTARGET”表示一个加谓词锁的对象,然后在此对象上施加“PREDICATELOCK”表示的谓词锁。
// The PREDICATELOCKTARGET struct represents a database object on which there are predicate locks.
typedef struct PREDICATELOCKTARGET //在一个“对象”上的谓词锁
{
/* hash key,一个标志,唯一表示一个对象 */
PREDICATELOCKTARGETTAG tag; /* unique identifier of lockable object */
/*谓词锁对象列表 */
SHM_QUEUE predicateLocks; //“PREDICATELOCK”对象的列表,其结构体如下
} PREDICATELOCKTARGET;
“PREDICATELOCK”对象的定义如下,一个谓词锁对象有一个唯一的使用“PREDICATELOCKTAG”定义的标识tag,然后包括两个列表(一个是表示某数据库的存在谓词锁对象的“PREDICATELOCKTARGET ”,一个是表示事务间冲突关系的“SERIALIZABLEXACT”,之后,):
typedef struct PREDICATELOCK //谓词锁
{
PREDICATELOCKTAG tag; //谓词锁的唯一的标识,被当作hash key以唯一标识谓词锁
SHM_QUEUE targetLink; /* list link in PREDICATELOCKTARGET's list of predicate locks */
SHM_QUEUE xactLink; /* list link in SERIALIZABLEXACT's list of predicate locks */
SerCommitSeqNo commitSeqNo; /* only used for summarized predicate locks */
} PREDICATELOCK;
当一个谓词锁对象有一个唯一的使用“PREDICATELOCKTAG”定义的标识tag,此tag则由两个结构体构成:
typedef struct PREDICATELOCKTAG //谓词锁的标识
{
PREDICATELOCKTARGET *myTarget;
SERIALIZABLEXACT *myXact;
} PREDICATELOCKTAG;