【问题标题】:JPA Concurrent Transaction StrategiesJPA 并发事务策略
【发布时间】:2012-09-08 11:31:14
【问题描述】:

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

这种策略似乎有点缺陷,并且需要大量手动验证,这可能会产生错误,JPA 框架是否提供了替代方法?

【问题讨论】:

  • 乐观锁不适合你吗?

标签: java jakarta-ee jpa concurrency


【解决方案1】:

据我了解,您正在尝试使用时间戳实现乐观锁定策略。

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

如果实体在保存时的版本与加载时的版本不同,则会抛出OptimisticLockingException,这意味着另一个用户/线程在两者之间修改了实体。您可以捕获此异常并决定做什么:

  • 告诉保存第二个的用户重新开始修改
  • 合并修改(如果可能)
  • 覆盖

这取决于用例。

另见:oracle javaee 6 tutorial on optimistic locking

【讨论】:

  • 这正是我所寻找的,我有 Origin 和 Destiny Products 的两个视图,这些可以由并发用户更新,如果发生这种情况,则会发出警告并且用户必须重新启动转移操作。我将用 JPA 提供的实现替换我的实现。非常感谢!
  • 好吧,您可能并不总是能够赶上OptimisticLockingException。 bean 有可能由容器管理,或者具有远程接口。您可能只是在业务逻辑末尾的 try/catch 块中获得容器启动的 ÈJBException, perhaps not even wrapped around the origin. All that is required by the container is to _log_ OptimisticLockingException. If you need this fine grained control, make sure you call the method EntityManager#flush`。如果锁定失败,您肯定会抓住OptimisticLockingException,并且可以随心所欲地使用它。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2014-09-01
  • 2011-01-17
  • 2016-08-16
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多