PostgreSQL 教程
1. PostgreSQL 教程 2. Linux 上安装 PostgreSQL 3. Windows 上安装 PostgreSQL 4. Mac OS 上安装 PostgreSQL 5. PostgreSQL 语法 6. PostgreSQL 数据类型 7. PostgreSQL 创建数据库 8. PostgreSQL 选择数据库 9. PostgreSQL 删除数据库 10. PostgreSQL 创建表格 11. PostgreSQL 删除表格 12. PostgreSQL 模式(SCHEMA) 13. PostgreSQL INSERT INTO 语句 14. PostgreSQL SELECT 语句 15. PostgreSQL 运算符 16. PostgreSQL 表达式 17. PostgreSQL WHERE 子句 18. PostgreSQL AND & OR 运算符 19. PostgreSQL UPDATE 语句 20. PostgreSQL DELETE 语句 21. PostgreSQL LIKE 子句 22. PostgreSQL LIMIT 子句 23. PostgreSQL ORDER BY 语句 24. PostgreSQL GROUP BY 语句 25. PostgreSQL WITH 子句 26. PostgreSQL HAVING 子句 27. PostgreSQL DISTINCT 关键字 28. PostgreSQL 约束 29. PostgreSQL 连接(JOIN) 30. PostgreSQL UNION 操作符 31. PostgreSQL NULL 值 32. PostgreSQL 别名 33. PostgreSQL 触发器 34. PostgreSQL 索引 35. PostgreSQL ALTER TABLE 命令 36. PostgreSQL TRUNCATE TABLE 37. PostgreSQL View(视图) 38. PostgreSQL TRANSACTION(事务) 39. PostgreSQL LOCK(锁) 40. PostgreSQL 子查询 41. PostgreSQL AUTO INCREMENT(自动增长) 42. PostgreSQL PRIVILEGES(权限) 43. PostgreSQL 时间/日期函数和操作符 44. PostgreSQL 常用函数

PostgreSQL LOCK(锁)

PostgreSQL LOCK(锁)

锁主要是为了保持数据库数据的一致性,可以阻止用户修改一行或整个表,一般用在并发较高的数据库中。

在多个用户访问数据库的时候若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

数据库中有两种基本的锁:排它锁(Exclusive Locks)和共享锁(Share Locks)。

如果数据对象加上排它锁,则其他的事务不能对它读取和修改。

如果加上共享锁,则该数据库对象可以被其他事务读取,但不能修改。

LOCK 命令语法

LOCK 命令基础语法如下:

LOCK [ TABLE ]

name

 IN

lock_mode
  • name:要锁定的现有表的名称(可选模式限定)。如果只在表名之前指定,则只锁定该表。如果未指定,则锁定该表及其所有子表(如果有)。
  • lock_mode:锁定模式指定该锁与哪个锁冲突。如果没有指定锁定模式,则使用限制最大的访问独占模式。可能的值是:ACCESS SHARE,ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE。

一旦获得了锁,锁将在当前事务的其余时间保持。没有解锁表命令;锁总是在事务结束时释放。

死锁

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

咨询锁

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

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

实例

创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:

db# 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)

下面的示例将 db 数据库中的 COMPANY 表锁定为 ACCESS EXCLUSIVE 模式。

LOCK 语句只在事务模式下工作。

db=#BEGIN;

LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

上面操作将得到下面结果:

LOCK TABLE

上面的消息指示表被锁定,直到事务结束,并且要完成事务,您必须回滚或提交事务。