如何使用 JPA 和 Hibernate 避免产品销售的竞争条件

Cod*_*der 2 java concurrency hibernate jpa transactions

我正在使用 Java Spring 框架和 Hibernate。我正在开发一个电子商务网络应用程序,公共用户可以从该网络应用程序购买产品。每个产品都会有一个数量计数。

问题

我想防止出现两个并发用户购买相同产品的数量值为 1 的情况。在这种情况下,只有第一个用户应该购买该产品,而第二个用户应该收到“无库存”消息。

工作流程

我打算减少数量,然后将购买信息发送到支付网关。如果支付网关遇到支付问题,我将增加数量计数。在购买信息发送到支付网关之前,锁定将被释放。

所以我的问题是,

1)我想确认这个关于悲观锁定的答案确实有助于解决我的问题。

2)我的工作流程还好吗?有一个更好的方法吗?

Vla*_*cea 8

您还可以使用乐观锁定并防止可能丢失的更新

使用乐观锁定,如果两个用户加载了数量为 的同一实体1,并且一个用户刚刚进行了购买并减少了数量计数器,那么第二个用户将无法更新产品实体,因为他的Product版本不更新t 与读取实体时在数据库中找到的那个匹配。

如果实体version发生更改,则在调用该方法时,UPDATE尝试匹配旧实体的语句version将返回 a 。那时 Hibernate 将检测到过时的状态情况并抛出一个.0executeUpdatePreparedStatementOptimisticLockException

SpringTransactionInterceptor将捕获该事件OptimisticLockException,并且关联的事务将被回滚。

乐观锁定方法比悲观锁定具有更好的扩展性,并且它也适用于多请求逻辑事务。