【问题标题】:How to avoid race conditions on product sales with JPA and Hibernate如何使用 JPA 和 Hibernate 避免产品销售的竞争条件
【发布时间】:2015-06-16 22:50:21
【问题描述】:

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

问题

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

工作流程

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

所以我的问题是,

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

2) 我的工作流程还好吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • 正是标准事务管理旨在处理的情况。
  • 标准事务是否足以解决问题?我想我需要申请锁。 =)

标签: java hibernate jpa concurrency transactions


【解决方案1】:

您还可以使用optimistic locking 并防止可能出现的lost updates

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

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

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

【讨论】:

  • 谢谢!对于尝试更新更改值的第二个用户(由第一个用户),如果我只是重试,是否合理?重试意味着重新获取新会话的数量并再次减少。
  • 我认为让用户手动重试更安全。也许 ha 正在更新产品名称,而您不想丢失该更新。仅当您将数量移动到 ProductStock 实体时,您才能隔离对数量的更改并因此自动重试事务。
  • 太棒了。感谢那里的帮助! =D
猜你喜欢
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
相关资源
最近更新 更多