You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA生成的PostgreSQL查询中FOR UPDATE OF指定表的锁范围疑问

PostgreSQL FOR UPDATE OF指定表别名的锁范围

先看你生成的查询:

select
    user0_.user_id as user_id1_0_,
    user0_.birthday as birthday2_0_,
    user0_.username as username3_0_ 
from
    users user0_ 
where
    user0_.username=$1
limit $2
for update of user0_ skip locked
  • 当FOR UPDATE OF后指定表别名(这里的user0_),最终会锁住符合查询条件的整行数据,不是只锁某一列。
  • PostgreSQL里所谓的FOR UPDATE OF指定列的写法,其实是个误导性的语法——PostgreSQL根本不支持列级锁,不管你写列名还是表别名/表名,锁的都是整行。
  • 单表查询场景下,FOR UPDATE OF user0_和直接写FOR UPDATE效果完全一致;如果是多表关联查询,FOR UPDATE OF的作用是明确指定要锁定哪张表的行,避免误锁其他关联表的数据。
  • 搭配的SKIP LOCKED意味着如果目标行已经被其他事务持有锁,当前查询会直接跳过这些行,不会进入等待锁释放的状态。

内容的提问来源于stack exchange,提问作者Violetta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:06:01