咨询锁函数
咨询锁函数用于管理咨询锁(Advisory Lock)。
- pg_advisory_lock(key bigint)
返回值类型:void
备注:pg_advisory_lock锁定应用程序定义的资源,该资源可以用一个64位或两个不重叠的32位键值标识。如果已经有另外的会话锁定了该资源,则该函数将阻塞到该资源可用为止。这个锁是排他的。多个锁定请求将会被压入栈中,因此,如果同一个资源被锁定了三次,它必须被解锁三次以将资源释放给其他会话使用。
- pg_advisory_lock(key1 int, key2 int)
返回值类型:void
备注:只允许sysadmin对键值对(65535, 65535)加会话级别的排他咨询锁,普通用户无权限。
- pg_advisory_lock(lock_id int4, lock_id int4, datebase_name Name)
描述:通过传入锁ID和数据库名字,获取指定数据库的排他咨询锁。
返回值类型:void
- pg_advisory_lock_shared(key bigint)
返回值类型:void
- pg_advisory_lock_shared(key1 int, key2 int)
返回值类型:void
备注:pg_advisory_lock_shared类似于pg_advisory_lock,不同之处仅在于共享锁会话可以和其他请求共享锁的会话共享资源,但排他锁除外。
- pg_advisory_unlock(key bigint)
返回值类型:Boolean
- pg_advisory_unlock(key1 int, key2 int)
返回值类型:Boolean
备注:pg_advisory_unlock释放先前取得的排他咨询锁。如果释放成功则返回true。如果实际上并未持有指定的锁,将返回false并在服务器中产生一条SQL警告信息。
- pg_advisory_unlock(lock_id int4, lock_id int4, datebase_name Name)
描述:通过传入锁ID和数据库名字,释放指定数据库上的排他咨询锁。
返回值类型:Boolean
备注:如果释放成功则返回true;如果未持有锁,则返回false。
- pg_advisory_unlock_shared(key bigint)
返回值类型:Boolean
- pg_advisory_unlock_shared(key1 int, key2 int)
返回值类型:Boolean
备注:pg_advisory_unlock_shared类似于pg_advisory_unlock,不同之处在于该函数释放的是共享咨询锁。
- pg_advisory_unlock_all()
返回值类型:void
备注:pg_advisory_unlock_all将会释放当前会话持有的所有咨询锁,该函数在会话结束的时候被隐含调用,即使客户端异常地断开连接也是一样。
- pg_advisory_xact_lock(key bigint)
返回值类型:void
- pg_advisory_xact_lock(key1 int, key2 int)
返回值类型:void
备注:pg_advisory_xact_lock类似于pg_advisory_lock,不同之处在于锁是自动在当前事务结束时释放,而且不能被显式的释放。只允许sysadmin对键值对(65535, 65535)加事务级别的排他咨询锁,普通用户无权限。
- pg_advisory_xact_lock_shared(key bigint)
返回值类型:void
- pg_advisory_xact_lock_shared(key1 int, key2 int)
返回值类型:void
备注:pg_advisory_xact_lock_shared类似于pg_advisory_lock_shared,不同之处在于锁是在当前事务结束时自动释放,而且不能被显式的释放。
- pg_try_advisory_lock(key bigint)
返回值类型:Boolean
备注:pg_try_advisory_lock类似于pg_advisory_lock,不同之处在于该函数不会阻塞以等待资源的释放。它要么立即获得锁并返回true,要么返回false表示目前不能锁定。
- pg_try_advisory_lock(key1 int, key2 int)
返回值类型:Boolean
备注:只允许sysadmin对键值对(65535, 65535)加会话级别的排他咨询锁,普通用户无权限。
- pg_try_advisory_lock_shared(key bigint)
返回值类型:Boolean
- pg_try_advisory_lock_shared(key1 int, key2 int)
返回值类型:Boolean
备注:pg_try_advisory_lock_shared类似于pg_try_advisory_lock,不同之处在于该函数尝试获得共享锁而不是排他锁。
- pg_try_advisory_xact_lock(key bigint)
返回值类型:Boolean
- pg_try_advisory_xact_lock(key1 int, key2 int)
返回值类型:Boolean
备注:pg_try_advisory_xact_lock类似于pg_try_advisory_lock,不同之处在于如果得到锁,在当前事务的结束时自动释放,而且不能被显式的释放。只允许sysadmin对键值对(65535, 65535)加事务级别的排他咨询锁,普通用户无权限。
- pg_try_advisory_xact_lock_shared(key bigint)
返回值类型:Boolean
- pg_try_advisory_xact_lock_shared(key1 int, key2 int)
返回值类型:Boolean
备注:pg_try_advisory_xact_lock_shared类似于pg_try_advisory_lock_shared,不同之处在于如果得到锁,在当前事务结束时自动释放,而且不能被显式的释放。
- lock_cluster_ddl()
描述:尝试对集群内所有存活的CN节点获取会话级别的排他咨询锁。
返回值类型:Boolean
备注:只允许sysadmin调用,普通用户无权限。
- unlock_cluster_ddl()
返回值类型:Boolean
会话级别咨询锁示例:
gaussdb=# select pg_advisory_lock(1); --依次获取3个会话级别的咨询锁 pg_advisory_lock ------------------ (1 row) gaussdb=# select pg_advisory_lock(1,2); pg_advisory_lock ------------------ (1 row) gaussdb=# select pg_advisory_lock(2,2,'postgres'); pg_advisory_lock ------------------ (1 row) gaussdb=# select * from pg_locks; --查询pg_locks表,看到新增了3个advisory类型的锁 locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+-----------------+-----------------+---------+----------+------ -------------+------------------ relation | 12850 | 10652 | | | | | | | | | 4/27611 | 140245958915840 | 140245958915840 | AccessShareLock | t | t | 3232: 299c:0:0:0:0 | 0:0#0 virtualxid | | | | | | 4/27611 | | | | | 4/27611 | 140245958915840 | 140245958915840 | ExclusiveLock | t | t | 4:6bd b:0:0:0:7 | 0:0#0 virtualxid | | | | | | 19/16219 | | | | | 19/16219 | 140246771033856 | 140246771033856 | ExclusiveLock | t | t | 13:3f 5b:0:0:0:7 | 0:0#0 virtualxid | | | | | | 17/97293 | | | | | 17/97293 | 140246750590720 | 140246750590720 | ExclusiveLock | t | t | 11:17 c0d:0:0:0:7 | 0:0#0 advisory | 12850 | | | | | | | 0 | 1 | 1 | 4/27611 | 140245958915840 | 140245958915840 | ExclusiveLock | t | f | 3232: 0:1:1:0:b | 0:0#0 advisory | 12850 | | | | | | | 1 | 2 | 2 | 4/27611 | 140245958915840 | 140245958915840 | ExclusiveLock | t | f | 3232: 1:2:2:0:b | 0:0#0 advisory | 12850 | | | | | | | 2 | 2 | 2 | 4/27611 | 140245958915840 | 140245958915840 | ExclusiveLock | t | f | 3232: 2:2:2:0:b | 0:0#0 (7 rows) gaussdb=# select pg_advisory_unlock(1); --依次释放3个会话级别的咨询锁 pg_advisory_unlock -------------------- t (1 row) gaussdb=# select pg_advisory_unlock(1,2); pg_advisory_unlock -------------------- t (1 row) gaussdb=# select pg_advisory_unlock(2,2,'postgres'); pg_advisory_unlock -------------------- t (1 row) gaussdb=# select * from pg_locks; --查询pg_locks表,看到3个advisory类型的锁已被释放 locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+-----------------+-----------------+---------+----------+------ -------------+------------------ relation | 12850 | 10652 | | | | | | | | | 4/27618 | 140245958915840 | 140245958915840 | AccessShareLock | t | t | 3232: 299c:0:0:0:0 | 0:0#0 virtualxid | | | | | | 4/27618 | | | | | 4/27618 | 140245958915840 | 140245958915840 | ExclusiveLock | t | t | 4:6be 2:0:0:0:7 | 0:0#0 virtualxid | | | | | | 19/16254 | | | | | 19/16254 | 140246771033856 | 140246771033856 | ExclusiveLock | t | t | 13:3f 7e:0:0:0:7 | 0:0#0 virtualxid | | | | | | 17/97506 | | | | | 17/97506 | 140246750590720 | 140246750590720 | ExclusiveLock | t | t | 11:17 ce2:0:0:0:7 | 0:0#0 (4 rows) gaussdb=# select pg_advisory_lock(1); --再次获取会话级别的咨询锁 pg_advisory_lock ------------------ (1 row) gaussdb=# select pg_advisory_unlock_all(); --释放所有会话级别的咨询锁 pg_advisory_unlock_all ------------------------ (1 row) gaussdb=# select * from pg_locks; --查询pg_locks表,看到advisory类型的锁已被释放 locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+-----------------+-----------------+---------+----------+------ -------------+------------------ relation | 12850 | 10652 | | | | | | | | | 4/27629 | 140245958915840 | 140245958915840 | AccessShareLock | t | t | 3232: 299c:0:0:0:0 | 0:0#0 virtualxid | | | | | | 4/27629 | | | | | 4/27629 | 140245958915840 | 140245958915840 | ExclusiveLock | t | t | 4:6be d:0:0:0:7 | 0:0#0 virtualxid | | | | | | 19/16369 | | | | | 19/16369 | 140246771033856 | 140246771033856 | ExclusiveLock | t | t | 13:3f f1:0:0:0:7 | 0:0#0 virtualxid | | | | | | 17/98194 | | | | | 17/98194 | 140246750590720 | 140246750590720 | ExclusiveLock | t | t | 11:17 f92:0:0:0:7 | 0:0#0 (4 rows)
事务级别咨询锁示例:
gaussdb=# select pg_advisory_xact_lock_shared(1); --获取事务级别的共享咨询锁 pg_advisory_xact_lock_shared ------------------------------ (1 row) gaussdb=# select * from pg_locks; --因单条语句视为一个事务,因此咨询锁已随事务提交自动释放。查询pg_locks表,看不到事务级咨询锁 locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+-----------------+-----------------+---------+----------+------ -------------+------------------ relation | 12850 | 10652 | | | | | | | | | 4/27631 | 140245958915840 | 140245958915840 | AccessShareLock | t | t | 3232: 299c:0:0:0:0 | 0:0#0 virtualxid | | | | | | 4/27631 | | | | | 4/27631 | 140245958915840 | 140245958915840 | ExclusiveLock | t | t | 4:6be f:0:0:0:7 | 0:0#0 virtualxid | | | | | | 19/16396 | | | | | 19/16396 | 140246771033856 | 140246771033856 | ExclusiveLock | t | t | 13:40 0c:0:0:0:7 | 0:0#0 virtualxid | | | | | | 17/98359 | | | | | 17/98359 | 140246750590720 | 140246750590720 | ExclusiveLock | t | t | 11:18 037:0:0:0:7 | 0:0#0 (4 rows) gaussdb=# start transaction; --显式开启事务块 START TRANSACTION gaussdb=# select pg_advisory_xact_lock_shared(1); --获取事务级别的共享咨询锁 pg_advisory_xact_lock_shared ------------------------------ (1 row) gaussdb=# select * from pg_locks; --查询pg_locks表,新增了一个advisory类型锁 locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+-----------------+-----------------+---------+----------+------ -------------+------------------ relation | 12850 | 10652 | | | | | | | | | 4/27632 | 140245958915840 | 140245958915840 | AccessShareLock | t | t | 3232: 299c:0:0:0:0 | 0:0#0 virtualxid | | | | | | 4/27632 | | | | | 4/27632 | 140245958915840 | 140245958915840 | ExclusiveLock | t | t | 4:6bf 0:0:0:0:7 | 0:0#0 virtualxid | | | | | | 19/16399 | | | | | 19/16399 | 140246771033856 | 140246771033856 | ExclusiveLock | t | t | 13:40 0f:0:0:0:7 | 0:0#0 virtualxid | | | | | | 17/98377 | | | | | 17/98377 | 140246750590720 | 140246750590720 | ExclusiveLock | t | t | 11:18 049:0:0:0:7 | 0:0#0 advisory | 12850 | | | | | | | 0 | 1 | 1 | 4/27632 | 140245958915840 | 140245958915840 | ShareLock | t | f | 3232: 0:1:1:0:b | 0:0#0 (5 rows) gaussdb=# commit; --提交事务块 COMMIT gaussdb=# select * from pg_locks; --查询pg_locks表,事务级别advisory类型锁已自动释放 locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+-----------------+-----------------+---------+----------+------ -------------+------------------ relation | 12850 | 10652 | | | | | | | | | 4/27633 | 140245958915840 | 140245958915840 | AccessShareLock | t | t | 3232: 299c:0:0:0:0 | 0:0#0 virtualxid | | | | | | 4/27633 | | | | | 4/27633 | 140245958915840 | 140245958915840 | ExclusiveLock | t | t | 4:6bf 1:0:0:0:7 | 0:0#0 virtualxid | | | | | | 19/16401 | | | | | 19/16401 | 140246771033856 | 140246771033856 | ExclusiveLock | t | t | 13:40 11:0:0:0:7 | 0:0#0 virtualxid | | | | | | 17/98385 | | | | | 17/98385 | 140246750590720 | 140246750590720 | ExclusiveLock | t | t | 11:18 051:0:0:0:7 | 0:0#0 (4 rows)
尝试获取咨询锁示例:gaussdb=# select pg_try_advisory_lock_shared(1); --在没有其他连接加咨询锁时,尝试获取对象1的共享咨询锁成功 pg_try_advisory_lock_shared ----------------------------- t (1 row) gaussdb=# select pg_advisory_unlock_all(); --释放这个咨询锁 pg_advisory_unlock_all ------------------------ (1 row) gaussdb=# select pg_advisory_lock(1); --获取对象1的排他咨询锁 pg_advisory_lock ------------------ (1 row) --保持这个连接不断开,新启动一个连接 gaussdb=# select pg_try_advisory_lock_shared(1); --因已有连接持有排他锁,所以新连接中尝试获取对象1的共享咨询锁失败 pg_try_advisory_lock_shared ----------------------------- f (1 row)