Code前端首页关于Code前端联系我们

PostgreSQL 锁命令语法、类型和示例

terry 2年前 (2023-09-26) 阅读数 43 #数据库

锁或独占锁或写锁可防止用户修改行或整个表。在 UPDATEDELETE 期间修改的行将在事务期间自动锁定。这将防止其他用户更改该行,直到事务提交或回滚。

当用户都尝试编辑同一行时,他们必须等待其他用户。如果他们以不同的方式更改行,则无需等待。 SELECT 问题无需等待。

数据库自动执行锁定。然而,在某些情况下,必须手动控制锁。可以使用命令 LOCK 来完成手动锁定。这允许定义密钥类型和事务范围。命令

LOCK 的语法

LOCK 的基本语法如下:
LOCK [ TABLE ]
name
 IN
lock_mode
SQL
  • name 键模式下的名称(带限定符)。如果在表名前指定ONLY,则仅锁定该表。如果未指定ONLY,则表和所有子表(如果有)将被锁定。
  • lock_mode:锁模式决定这个锁与哪个锁冲突。如果未指定锁定模式,则使用限制性最强的访问模式 ACCESS EXCLUSIVE。可能的值为:访问共享行共享行独占独占共享、共享独占, 共享行独占独占独占访问

死锁

当两个事务相互等待对方完成操作时,可能会发生死锁。尽管 PostgreSQL 可以通过 ROLLBACK 检测并终止,但死锁仍然会带来不便。为了防止您的应用程序遇到此问题,请确保您的设计方式能够以相同的顺序锁定对象。

咨询锁

PostgreSQL 提供了一种创建具有应用程序定义含义的锁的方法。这就是所谓的咨询锁(advisory lock,英文:advisory lock)。因为系统不强制使用它,所以应用程序会正确使用它。建议锁可用于锁定针对 MVCC 模型的策略。

例如,咨询锁的常见用途是模拟称为“平面文件”的数据管理系统中典型的悲观锁定策略。虽然表中存储的标志可以用于相同的目的,但建议锁定速度更快,这样表就不会臃肿,并且在会话结束时会被服务器自动删除。示例 独家 模式。 锁定数据库中的表yiibai_db。语句 LOCK 只能在事务模式下使用:

yiibai_db=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
SQL

PostgreSQL 上述语句将产生以下结果:

LOCK TABLE
Shell 上述消息表明上面的表已被锁定事务结束并完成事务,必须返回或提交事务。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门