2012-09-08 105 views
0

我正在使用JPA 2.0 -EclipseLink和我已经遇到需要实现并发交易的仓库管理系统,目前我正在执行时间戳差异来验证上次更改数量的时间戳:添加,删除,转移。JPA并发交易策略

这个策略看起来有点缺陷,需要大量的手动验证,这可能会产生错误,JPA框架提供了这种替代方法吗?

+0

乐观锁定不适合你吗? – home

回答

1

据我所知,你正试图实现一个带时间戳的乐观锁定策略。

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

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

  • 告诉保存的第二重启其修改用户
  • 合并修改(如果可能)
  • 覆盖

这取决于用例。

另见:oracle javaee 6 tutorial on optimistic locking

+0

这是我寻找的东西,我有Origin和Destiny产品的两个视图,并且这些视图可以被并发用户更新,如果发生这种情况,警告被激活并且用户必须重新启动传输操作。我将用JPA提供的实现替换我的实现。非常感谢! – Astronaut

+0

那么你可能不会总能抓住'OptimisticLockingException'。 bean有可能由容器管理,或者有远程接口。你可能只是得到一个容器发起的ÈJBException',可能甚至没有包裹起源。所有容器所需要的是_log_'OptimisticLockingException'。如果你需要这个细粒度的控件,确保在业务逻辑结尾的try/catch块中调用EntityManager#flush方法。如果锁定失败,您肯定会收到'OptimisticLockingException',并且可以随心所欲地执行任何操作。 –