我正在努力了解Postgresql行级锁有人可以帮助我了解何时使用每种类型的锁.

     FOR UPDATE; FOR NO KEY UPDATE; FOR SHARE; FOR KEY SHARE;

我试图查看文档,但仍然无法理解其中的区别,也不知道何时使用什么以及它如何产生影响.

我希望有人能帮助我了解每个锁的用例,并让我清楚何时 Select 每个锁.

推荐答案

  • 如果您计划删除一行或更新属于公钥或唯一约束的列,请在FOR UPDATE模式下锁定该行

  • 如果您计划仅更新不属于公钥或唯一约束的列,则在FOR NO KEY UPDATE模式下锁定行

  • 如果您不希望其他人修改一行,则在FOR SHARE模式下锁定该行(这是一个非常罕见的要求)

  • 如果您想防止其他人删除该行或更新属于公钥或唯一约束的列,请在FOR KEY SHARE模式下锁定该行(这也是一个非常罕见的要求)

很难想出一个要求显式使用FOR SHAREFOR KEY SHARE的用例;它们被视为内部数据库,以确保不违反外部密钥约束.

Sql相关问答推荐

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

用相同值更新行

从列的不同值创建列

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

如何在Presto中将多个列合并到一个数组中

删除事务中的本地临时表

为什么我的SQL标量函数有时会抛出";子查询返回多个值.这是不允许的.

根据最大值为字母数字大小写分配数值

Redshift PL/pgSQL循环中的参数化列名

在查询Oracle SQL中创建替代ID

数据库SQL-CTE命名空间(错误?)使用临时视图

Select 组中的第一行,但在并发环境中

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

创建具有多个子查询的 SQL 视图

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

postgres按组消除分区中的NULLS

SQL查询以获取从特定可变日期看到的用户

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法

PostgreSQL 中的递归树查询

连接表时避免重复