向我显示了一张票证,其中@Lock(LockModeType.PESSIMISTIC_WRITE)
使用缓存的值
示例:
有授权模式:
public class Authorization {
...
@ManyToOne
@JoinColumn(name = "wallet_id", nullable = false)
private Wallet wallet;
...
}
发出请求
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select a from Authorization a " +
"where ((a.id in ?1)")
List<Authorization> findAllAuthorize(Set<UUID> authorizeList);
这里生成了几个查询,其中提取了授权以进行更新,但是创建了单独的查询以提取钱包,并且提取了该查询而不是进行更新(因为我们不使用类似join fetch a.wallet w
的东西)。
经过一些操作后,会发出新的请求,例如
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Wallet> findByOwnerIdIn(Set<String> ownerIds);
但是出于某种原因,来自第一个请求的钱包会被缓存并用于替代选择更新,因此实际上并未锁定钱包,这会导致并发问题。
所以我的问题是预期的行为。我可以以某种方式确保第二个查询不使用第一个查询的结果,而是使用spring数据注释向数据库发出请求吗?