锁定数据库
LOCK DATABASE
LOCK DATABASE 是一种数据库级别的锁定机制。此功能尚未在 PostgreSQL 中实现,也没有计划中。
概要
LOCK DATABASE db_name [IN dblockmode MODE] [NOWAIT]; UNLOCK DATABASE db_name;
dblockmode 具有以下选项:SHARE | EXCLUSIVE
EXCLUSIVE 排除在数据库上运行的所有 SQL 查询。不允许外部应用程序进行任何连接。SHARE 授权 SELECT 查询并连接至数据库。DDL 和 DML 被阻止。
特性
LOCK DATABASE 是一种数据库级别的锁定,在获得锁定之前等待任何锁的释放。例如,如果对该数据库的某个表进行了锁定,LOCK DATABASE 将一直等到该锁定被释放。在等待锁定期间,无法获取此数据库的新表锁定。
还可以设置 NOWAIT,当无法立即获得锁时,它会使 LOCK DATABASE 返回一个错误。这种机制可以确保在获得锁时,没有任何事务可以在此数据库上运行,也没有任何用户可以访问此数据库。
可以通过 UNLOCK DATABASE 命令或当使用此数据库的会话断开连接时释放锁定。PostgreSQL 在使用此类机制时,始终获取最低级别的锁。如果数据库管理员或超级用户需要更严格的锁定机制,可以使用 LOCK DATABASE。
用法
- 服务器维护
无需对数据库中的多个表进行锁定。
- 节点集群
查询为自动提交时,PostgreSQL 无法确保在同一时刻对多个节点进行的 DROP DATABASE 查询。如果应用程序保持对数据库的连接处于活动状态,则很容易导致节点上的 DROP 查询失败。但是,如果集群上该节点上没有处于活动状态的会话,则 DROP 将成功。在这种情况下,LOCK DATABASE 可用作 2PC(与两阶段提交类似)机制,以在节点集群中确保删除数据库。