开发手册 欢迎您!
软件开发者资料库

PostgreSQL - LOCKS

PostgreSQL LOCKS - 从简单和简单的步骤学习PostgreSQL,从基本到高级概念,包括数据库编程,概述,环境设置,语法,数据类型,创建,选择,删除数据库,删除,创建表,架构,插入,选择,更新,删除查询,运算符,表达式,Where,Like,Limit,Order By,Group By,With,having Clause,AND AND OR运算符,Distinct Keyword,Constraints,Joins,Unions Clause,NULL Values,Alias Syntax,Triggers,Indexes ,更改表命令,截断表命令,视图,事务,锁,子查询,自动增量,权限,日期/时间函数和操作符,函数,有用函数,C / C ++,JAVA,PHP,Perl,Python接口。

锁定独占锁定写入锁定会阻止用户修改行或整个表格.然后,UPDATE和DELETE修改的行将在事务期间自动锁定.这可以防止其他用户在提交或回滚事务之前更改行.

用户必须等待其他用户的唯一时间是他们尝试修改同一行时.如果他们修改不同的行,则无需等待. SELECT查询永远不必等待.

数据库自动执行锁定.但是,在某些情况下,必须手动控制锁定.可以使用LOCK命令完成手动锁定.它允许指定事务的锁类型和范围.

LOCK命令的语法

LOCK命令的基本语法如下 :

  LOCK [TABLE]  name  IN  lock_mode

  • name : 要锁定的现有表的名称(可选择模式限定).如果在表名之前指定了ONLY,则仅锁定该表.如果未指定ONLY,则表及其所有后代表(如果有)将被锁定.

  • lock_mode : 锁定模式指定此锁与哪些锁冲突.如果未指定锁定模式,则使用最严格模式ACCESS EXCLUSIVE.可能的值包括:ACCESS SHARE,ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHOW ROW EXOWUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE.

一旦获得,锁定将保留当前事务的剩余部分.没有UNLOCK TABLE命令;锁总是在事务结束时释放.

DeadLocks

当两个事务正在等待彼此完成其操作时,可能会发生死锁.虽然PostgreSQL可以检测到它们并以ROLLBACK结束它们,但死锁仍然不方便.为了防止您的应用程序遇到此问题,请确保以相同顺序锁定对象的方式设计它们.

咨询锁

PostgreSQL提供了创建具有应用程序定义含义的锁的方法.这些被称为咨询锁.由于系统不强制使用它们,因此应用程序可以正确使用它们.咨询锁对于锁定适合MVCC模型的策略非常有用.

例如,咨询锁的常见用法是模拟所谓的悲观锁定策略. "平面文件"数据管理系统.虽然存储在表中的标志可以用于相同的目的,但是建议锁更快,避免表膨胀,并且在会话结束时由服务器自动清理.

示例

考虑公司表记录如下 :

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)

以下示例以ACCESS EXCLUSIVE模式锁定testdb数据库中的COMPANY表. LOCK语句仅适用于事务模式 :

testdb=#BEGIN;LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

上面给出的PostgreSQL语句将产生以下结果 :

LOCK TABLE

上述消息表明该表已锁定,直到事务结束,并且要完成事务,您必须回滚或提交事务.