锁定 postgres 中的特定行

新手上路,请多包涵

我对 Postgres 还很陌生,我正试图弄清楚如何锁定表格的特定行。

例如,我有一个用户表:

 Name: John, Money: 1
Name: Jack, Money: 2

在我的后端,我想选择 John 并确保在我的事务完成之前没有其他调用可以更新(甚至可能选择)John 的行。

我想我需要一个我在网上阅读的内容的排他锁?我似乎找不到一个很好的例子来锁定在线表中的 1 行,知道吗?

编辑 - 我应该在像@SqlUpdate 这样的方法级别(或某种形式 - 使用 org.skife.jdbi.v2)还是在查询本身中这样做?

原文由 Greg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 618
1 个回答

您可以使用

LOCK TABLE table IN ACCESS EXCLUSIVE MODE;

当你准备好从你的桌子上阅读时。 “SELECT”和所有其他操作将排队直到事务结束(提交更改或回滚)。

请注意,这将锁定整个表,并且参考 PostgreSQL,没有可以独占锁定特定行的表级锁。

所以你可以使用

FOR UPDATE

所有 SELECT 中的行级锁定将更新您的行,这将阻止所有将更新行的 SELECT 读取您的行!

PostgreSQL 文档:

FOR UPDATE 导致 SELECT 语句检索到的行被锁定,就像更新一样。这可以防止它们被其他事务锁定、修改或删除,直到当前事务结束。即其他事务尝试对这些行进行UPDATE、DELETE、SELECT FOR UPDATE、SELECT FOR NO KEY UPDATE、SELECT FOR SHARE或SELECT FOR KEY SHARE的事务将被阻塞,直到当前事务结束;相反, SELECT FOR UPDATE 将等待已在同一行上运行任何这些命令的并发事务,然后将锁定并返回更新的行(或没有行,如果该行已被删除)。但是,在 REPEATABLE READ 或 SERIALIZABLE 事务中,如果要锁定的行在事务启动后发生更改,则会引发错误。有关进一步的讨论,请参见第 13.4 节。

FOR UPDATE 锁定模式也被行上的任何 DELETE 以及修改某些列上的值的 UPDATE 获取。目前,为 UPDATE 案例考虑的列集是那些具有唯一索引的列,可以在外键中使用(因此不考虑部分索引和表达式索引),但这可能会在未来发生变化。*

原文由 abdelgrib 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进