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

How to avoid race conditions on product sales with JPA and Hibernate

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

问题

我想防止两个并发用户购买同一产品的情况下数量值为 1。在这种情况下,只有第一个用户应该购买该产品,而第二个用户应该收到 "no stock available" 消息.

工作流程

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

所以我的问题是,

1) 我想确认 this answer 悲观锁定确实有助于解决我的问题。

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

您也可以使用optimistic locking and prevent possible lost updates

使用乐观锁定,如果两个用户用一堆实体加载了同一个实体,并且一个用户刚刚购买并减少了计数器,那么第二个用户将无法更新产品实体,因为他的产品版本与数据库中找到的版本不匹配(由第一个用户递增)。

如果出现任何异常 (StaleStateException),则回滚当前事务并且不会对数据库应用任何更改(例如针对零数量的产品添加 OrderLine)。

乐观锁定方法比悲观锁定更好地扩展,它也适用于多请求逻辑事务。