Spring Data JDBC中PESSIMISTIC_WRITE与PESSIMISTIC_READ能否互换?
Spring Data JDBC中PESSIMISTIC_READ与PESSIMISTIC_WRITE的区别及不可互换性
这两种悲观锁类型绝对不能互换使用,它们的语义和PostgreSQL底层实现完全不同,你的理解存在部分偏差,具体说明如下:
1. PESSIMISTIC_READ(共享锁)
- 对应PostgreSQL的
SELECT ... FOR SHARE语句 - 核心行为:获取共享锁后,允许其他事务读取该记录,但会阻塞所有试图修改(更新/删除)这条记录的事务
- 纠正认知:它不会阻塞普通读取操作,其他事务依然可以正常查询该座位数据,只是无法修改。
2. PESSIMISTIC_WRITE(排他锁)
- 对应PostgreSQL的
SELECT ... FOR UPDATE语句 - 核心行为:获取排他锁后,既阻塞其他事务对该记录的修改操作,也阻塞其他事务获取该记录的共享锁(即其他用PESSIMISTIC_READ的查询会被卡住)
- 纠正认知:它不会阻塞所有读取——PostgreSQL基于MVCC特性,其他事务不加锁的普通
SELECT依然能读取到该记录的快照版本,只有加了悲观锁的读取会被阻塞。
适用场景差异
- 若你仅需确保读取期间座位记录不被修改,用
PESSIMISTIC_READ即可,锁粒度更轻,能保留更高的读并发。 - 若你读取座位后要执行修改操作(比如更新座位状态),必须用
PESSIMISTIC_WRITE,防止其他事务同时修改导致数据冲突。
内容的提问来源于stack exchange,提问作者Kobi
相关产品推荐
相关产品推荐

