我有更新商品数量的方法。
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
)。
那么我该如何处理这种情况而又不遗失? (可以很好地实现)
答案 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?之类)。