- PostgreSQL 教程
- PostgreSQL - 主页
- PostgreSQL - 概述
- PostgreSQL - 环境设置
- PostgreSQL - 语法
- PostgreSQL - 数据类型
- PostgreSQL - 创建数据库
- PostgreSQL - 选择数据库
- PostgreSQL - 删除数据库
- PostgreSQL - 创建表
- PostgreSQL - 删除表
- PostgreSQL - 架构
- PostgreSQL - 插入查询
- PostgreSQL - 选择查询
- PostgreSQL - 运算符
- PostgreSQL - 表达式
- PostgreSQL -Where 子句
- PostgreSQL - AND & OR 子句
- PostgreSQL - 更新查询
- PostgreSQL - 删除查询
- PostgreSQL - Like 子句
- PostgreSQL - 限制条款
- PostgreSQL - Order By 子句
- PostgreSQL - 分组依据
- PostgreSQL - With 子句
- PostgreSQL -having 子句
- PostgreSQL - 独特的关键字
- 高级 PostgreSQL
- PostgreSQL - 约束
- PostgreSQL - 连接
- PostgreSQL - 联合条款
- PostgreSQL - NULL 值
- PostgreSQL - 别名语法
- PostgreSQL - 触发器
- PostgreSQL - 索引
- PostgreSQL - 更改表命令
- 截断表命令
- PostgreSQL - 视图
- PostgreSQL - 事务
- PostgreSQL - 锁
- PostgreSQL - 子查询
- PostgreSQL - 自动增量
- PostgreSQL - 权限
- 日期/时间函数和运算符
- PostgreSQL - 函数
- PostgreSQL - 有用的函数
- PostgreSQL 有用资源
- PostgreSQL - 快速指南
- PostgreSQL - 有用的资源
- PostgreSQL - 讨论
PostgreSQL - 锁
锁或独占锁或写锁可防止用户修改行或整个表。然后,在事务期间,由 UPDATE 和 DELETE 修改的行将被自动锁定。这可以防止其他用户更改该行,直到事务提交或回滚。
用户必须等待其他用户的唯一时间是当他们尝试修改同一行时。如果他们修改不同的行,则无需等待。SELECT 查询永远不必等待。
数据库自动执行锁定。然而,在某些情况下,必须手动控制锁定。可以使用 LOCK 命令来手动锁定。它允许指定事务的锁定类型和范围。
LOCK 命令的语法
LOCK 命令的基本语法如下 -
LOCK [ TABLE ] name IN lock_mode
name - 要锁定的现有表的名称(可选模式限定)。如果在表名之前指定 ONLY,则仅锁定该表。如果未指定 ONLY,则该表及其所有后代表(如果有)将被锁定。
lock_mode - 锁定模式指定该锁与哪个锁发生冲突。如果未指定锁定模式,则使用限制最严格的模式 ACCESS EXCLUSIVE。可能的值为:访问共享、行共享、行独占、共享更新独占、共享、共享行独占、独占、访问独占。
一旦获得,该锁将在当前事务的剩余部分中保持。没有 UNLOCK TABLE 命令;锁总是在事务结束时释放。
死锁
当两个事务互相等待对方完成其操作时,可能会发生死锁。虽然 PostgreSQL 可以检测到它们并通过 ROLLBACK 结束它们,但死锁仍然会带来不便。为了防止您的应用程序遇到此问题,请确保以相同的顺序锁定对象的方式设计它们。
咨询锁
PostgreSQL 提供了创建具有应用程序定义含义的锁的方法。这些称为咨询锁。由于系统不强制使用它们,因此由应用程序正确使用它们。咨询锁对于不适合 MVCC 模型的锁定策略非常有用。
例如,咨询锁的常见用途是模拟典型的所谓“平面文件”数据管理系统的悲观锁定策略。虽然存储在表中的标志可用于相同目的,但咨询锁速度更快,避免表膨胀,并且会在会话结束时由服务器自动清除。
例子
考虑表COMPANY的记录如下 -
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
上面的消息表明表被锁定,直到事务结束,要完成事务,您必须回滚或提交事务。