PostgreSQL锁LOCK命令的语法、类型与示例

2018-09-1713:48:18数据库教程Comments4,423 views字数 1289阅读模式

锁或独占锁或写锁阻止用户修改行或整个表。 在UPDATEDELETE修改的行在事务的持续时间内被自动独占锁定。 这将阻止其他用户更改行,直到事务被提交或回退。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

用户必须等待其他用户当他们都尝试修改同一行时。 如果他们修改不同的行,不需要等待。 SELECT查询不必等待。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

数据库自动执行锁定。 然而,在某些情况下,必须手动控制锁定。 手动锁定可以通过使用LOCK命令完成。 它允许指定事务的锁类型和范围。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

LOCK命令的语法

LOCK命令的基本语法如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

LOCK [ TABLE ]
name
 IN
lock_mode
SQL
  • name:要锁定的现有表的锁名称(可选模式限定)。 如果在表名之前指定了ONLY,则仅该表被锁定 如果未指定ONLY,则表及其所有后代表(如果有)被锁定。
  • lock_mode:锁模式指定此锁与之冲突的锁。 如果未指定锁定模式,则使用最严格的访问模式ACCESS EXCLUSIVE。 可能的值是:ACCESS SHAREROW SHAREROW EXCLUSIVESHARE UPDATE EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE

死锁

当两个事务正在等待彼此完成操作时,可能会发生死锁。 虽然PostgreSQL可以检测到它们并使用ROLLBACK结束,但死锁仍然可能不方便。 为了防止您的应用程序遇到此问题,请确保以这样的方式进行设计,以使其以相同的顺序锁定对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

咨询锁

PostgreSQL提供了创建具有应用程序定义含义的锁的方法。这些称为咨询锁(劝告锁,英文为:advisory locks)。 由于系统不强制使用它,因此应用程序正确使用它们。 咨询锁可用于锁定针对MVCC模型策略。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

例如,咨询锁的常见用途是模拟所谓的“平面文件”数据管理系统的典型的悲观锁定策略。 虽然存储在表中的标志可以用于相同的目的,但是建议锁更快,避免了表的膨胀,并且在会话结束时被服务器自动清除。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

示例

考虑表COMPANY有以下记录:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)
SQL

以下示例在ACCESS EXCLUSIVE模式下将COMPANY表锁定在yiibai_db数据库中。 LOCK语句仅在事务模式下工作:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

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

PostgreSQL上面的语句将产生以下结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

LOCK TABLE
Shell

上述消息表示表被锁定,直到事务结束并完成事务,必须回滚或提交事务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/4958.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/4958.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定