我在尝试使用 Spring 数据和 Hibernate 作为 JPA 实现和 Postgresql 选择更新行时遇到了问题。
假设我们有实体:A,B,C。
public class A{
@Id
private Long id;
@OneToMany(fetch = FetchType.EAGER)
private Set<B> bSet;
@OneToMany(fetch = FetchType.EAGER)
private Set<C> cSet;
}
假设我们想要选择 A 以及所有相关的 B 和 C 实体进行更新,即锁定与 A 表相关的行。
@Query(SELECT a FROM A a
LEFT JOIN FETCH a.bSet
LEFT JOIN FETCH a.cSet
WHERE a.id=?)
@Lock(LockModeType.PESSIMISTIC_WRITE)
public A selectAndLockA(Long Aid);
查询看起来像
SELECT a.column1, ... from tableA a LEFT JOIN tableB b ... FOR UPDATE of a,c
用于更新 a,c
该查询将尝试锁定两个表,这会导致异常,例如:org.postgresql.util.PSQLException:错误:FOR UPDATE 无法应用于外连接的可为空一侧
我尝试归档的是仅锁定第一个表“FOR UPDATE OF a”
是否可以以某种方式配置或告诉 Hibernate 仅锁定第一个表。
PostreSQL 不支持此功能。如果您执行外部 SELECT,则没有什么可以阻止某人将行插入到 LEFT JOINED 表中,从而修改您正在查看的结果集(例如,重复读取时列将不再为 NULL)。
详细解释请参见here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)