我正在研究Spring Data JPA.考虑下面的示例,我将默认使用所有crud和finder功能,如果我想自定义查找器,那么也可以在界面本身轻松完成.
@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("<JPQ statement here>")
List<Account> findByCustomer(Customer customer);
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何为上述AccountRepository添加一个完整的自定义方法及其实现?由于它的接口我无法在那里实现该方法.
我正在使用
我希望findOne在我的Spring Data存储库中有一个带有悲观锁的findOne方法,该方法与已经提供的方法分开.
根据这个答案,我写道:
public interface RegistrationRepository extends CrudRepository<Registration, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select r from Registration r where r.id = ?1")
Registration findOnePessimistic(Long id);
}
Run Code Online (Sandbox Code Playgroud)
这几乎可行.
不幸的是,这不会刷新实体管理器缓存中我的实体的先前实例.我有两个并发请求更新我的注册状态
因此破坏了行为.
任何线索为什么@Lock没有开箱即用刷新实体经理?
更新
这是请求的示例代码:
public interface RegistrationRepository extends CrudRepository<Registration, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select r from registration_table r where r.id = ?1")
Registration findOnePessimistic(Long id);
}
public void RegistrationService {
@Transactional
public void …Run Code Online (Sandbox Code Playgroud) 如何@Lock为查询指定超时.我正在使用oracle 11g,我希望我可以使用类似的东西'select id from table where id = ?1 for update wait 5'.
我定义了这样的方法,
@Lock(LockModeType.PESSIMISTIC_WRITE)
Stock findById(String id);
Run Code Online (Sandbox Code Playgroud)
它似乎永远锁定.我开始javax.persistence.lock.timeout=0了LocalContainerEntityManagerFactoryBean.jpaProperties,但没有受到影响.
我正在使用 Java Spring 框架和 Hibernate。我正在开发一个电子商务网络应用程序,公共用户可以从该网络应用程序购买产品。每个产品都会有一个数量计数。
问题
我想防止出现两个并发用户购买相同产品的数量值为 1 的情况。在这种情况下,只有第一个用户应该购买该产品,而第二个用户应该收到“无库存”消息。
工作流程
我打算减少数量,然后将购买信息发送到支付网关。如果支付网关遇到支付问题,我将增加数量计数。在购买信息发送到支付网关之前,锁定将被释放。
所以我的问题是,
1)我想确认这个关于悲观锁定的答案确实有助于解决我的问题。
2)我的工作流程还好吗?有一个更好的方法吗?