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
相关产品推荐
相关产品推荐

