Java JPA并发事务策略

Java JPA并发事务策略,java,jakarta-ee,jpa,concurrency,Java,Jakarta Ee,Jpa,Concurrency,我正在使用JPA 2.0-EclipseLink开发一个仓库管理系统,我遇到了实现并发事务的需要,目前我正在实现一个时间戳差异,以验证上次更改数量的时间:添加、删除、转移 这个策略似乎有点缺陷,需要大量的手动验证,这可能会产生错误。JPA框架是否提供了其他方法来实现这一点?据我所知,您正在尝试实施带有时间戳的乐观锁定策略 JPA在版本字段的帮助下提供了开箱即用的乐观锁定机制。基本上,您的实体中有一个版本字段(short、int、long或时间戳),该字段在每次修改实体时递增/设置 如果实体在保存

我正在使用JPA 2.0-EclipseLink开发一个仓库管理系统,我遇到了实现并发事务的需要,目前我正在实现一个时间戳差异,以验证上次更改数量的时间:添加、删除、转移


这个策略似乎有点缺陷,需要大量的手动验证,这可能会产生错误。JPA框架是否提供了其他方法来实现这一点?

据我所知,您正在尝试实施带有时间戳的乐观锁定策略

JPA在版本字段的帮助下提供了开箱即用的乐观锁定机制。基本上,您的实体中有一个版本字段(
short
int
long
时间戳
),该字段在每次修改实体时递增/设置

如果实体在保存时的版本与其在加载时的版本不同,则会抛出
OptimisticLockingException
,这意味着另一个用户/线程在其间修改了该实体。您可以捕获此异常并决定要执行的操作:

  • 告诉保存秒数的用户重新启动其修改
  • 合并修改(如果可能)
  • 覆盖
这取决于用例


另请参见:oracle

乐观锁定对您不起作用吗?这正是我所寻找的,我有两个Origin和Destiny产品的视图,这些视图可以由并发用户更新,如果发生这种情况,将发出警告,用户必须重新启动传输操作。我将用JPA提供的实现替换我的实现。非常感谢!您可能并不总是能够捕获到
乐观锁定异常。有可能bean由容器管理,或者具有远程接口。您可能只是得到一个容器启动的ÈJBException
,甚至可能没有包装在源代码周围。容器所需的全部内容是_log 
OptimisticLockingException
。如果需要这种细粒度控制,请确保在业务逻辑末尾的try/catch块中调用方法
EntityManager#flush`。如果锁定失败,您肯定会捕获到
OptimisticLockingException
,并可以用它做任何您喜欢的事情。