我对 Postgres 还很陌生,我正试图弄清楚如何锁定表格的特定行。
例如,我有一个用户表:
Name: John, Money: 1
Name: Jack, Money: 2
在我的后端,我想选择 John 并确保在我的事务完成之前没有其他调用可以更新(甚至可能选择)John 的行。
我想我需要一个我在网上阅读的内容的排他锁?我似乎找不到一个很好的例子来锁定在线表中的 1 行,知道吗?
编辑 - 我应该在像@SqlUpdate 这样的方法级别(或某种形式 - 使用 org.skife.jdbi.v2)还是在查询本身中这样做?
原文由 Greg 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
当你准备好从你的桌子上阅读时。 “SELECT”和所有其他操作将排队直到事务结束(提交更改或回滚)。
请注意,这将锁定整个表,并且参考 PostgreSQL,没有可以独占锁定特定行的表级锁。
所以你可以使用
所有 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 案例考虑的列集是那些具有唯一索引的列,可以在外键中使用(因此不考虑部分索引和表达式索引),但这可能会在未来发生变化。*