PostgreSQL V9.6 谓词锁--01

时间:2023-02-05 05:56:14
今天上午,2016年8月21日,巴西里约奥运会,女排3:1胜对手,打出一场拼搏的精神。
----------------------------------------------

谓词锁

    本节内容介绍谓词锁相关的结构体以及他们之间的关系,谓词锁相关的结构体之间的关系可参见图X-XX

 

PostgreSQL V9.6 谓词锁--01
 

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;

    所以, PostgreSQL 使用“ PREDICATELOCK ”结构体表示一个谓词锁,然后用一个对象和事务作为此谓词锁的标识( tag )来标识一个谓词锁,这表明谓词锁是数据库对象和事务间的一个特定关系,只是这样的关系是用以表示读写冲突的。