【发布时间】:2012-09-08 11:31:14
【问题描述】:
我正在使用 JPA 2.0 - EclipseLink 开发仓库管理系统,我遇到了实现并发事务的需要,目前我正在实现时间戳差异来验证上次更改数量的时间:添加、删除、转移。
这种策略似乎有点缺陷,并且需要大量手动验证,这可能会产生错误,JPA 框架是否提供了替代方法?
【问题讨论】:
-
乐观锁不适合你吗?
标签: java jakarta-ee jpa concurrency
我正在使用 JPA 2.0 - EclipseLink 开发仓库管理系统,我遇到了实现并发事务的需要,目前我正在实现时间戳差异来验证上次更改数量的时间:添加、删除、转移。
这种策略似乎有点缺陷,并且需要大量手动验证,这可能会产生错误,JPA 框架是否提供了替代方法?
【问题讨论】:
标签: java jakarta-ee jpa concurrency
据我了解,您正在尝试使用时间戳实现乐观锁定策略。
JPA 在版本字段的帮助下提供了开箱即用的乐观锁定机制。基本上,您的实体中有一个版本字段(short、int、long 或 Timestamp),每次修改实体时都会增加/设置。
如果实体在保存时的版本与加载时的版本不同,则会抛出OptimisticLockingException,这意味着另一个用户/线程在两者之间修改了实体。您可以捕获此异常并决定做什么:
这取决于用例。
另见:oracle javaee 6 tutorial on optimistic locking
【讨论】:
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,并且可以随心所欲地使用它。