如何与并发用户一起处理乐观锁定项目数量更新?

时间:2019-03-30 18:22:36

标签: java spring hibernate transactional optimistic-locking

我有更新商品数量的方法。

MyEntity的@Version注释版本属性很长。

有一个项目列表端点/items 还有一个项目更新终结点/item/update(考虑为产品库存,购买项目)

因此N个并发用户希望更新同一项目。

但是抛出org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1异常。正在更新。

同样在这个时候,/items端点无法返回数据。或等待用户返回的时间过长。(如果此时更新用户的数量过多,则也会得到exception timeout)。

那么我该如何处理这种情况而又不遗失? (可以很好地实现)

1 个答案:

答案 0 :(得分:0)

不幸的是,当发生争用时,JPA / Hibernate在批处理插入中不能很好地发挥作用:每当在Hibernate会话的上下文中抛出 any 异常时,您就很不走运。

请参阅13.2.3。 https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html#transactions-optimistic

的异常处理

具体地说:

  

Hibernate抛出的异常不能被视为可恢复的。确保   通过在finally块中调用close()来关闭会话。

过去,我不得不将JPA代码迁移到QueryDSL或回退到原始SQL和JdbcTemplate(类似How to do multiple inserts in database using spring JDBC Template batch?之类)。