- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 JPA 的新手,如果不清楚,请原谅我。
基本上我想通过使用乐观锁来防止并发修改。我已将 @Version 属性添加到我的实体类中。
我需要知道这个处理 OptimisticLockException 的算法是否合理。我要使用 Execute Around Idiom像这样:
interface UpdateUnitOfWork
{
doUpdate( User user ); /* may throw javax.persistence.PersistenceException */
}
public boolean exec( EntityManager em, String userid, UpdateUnitOfWork work)
{
User u = em.find( User, userid );
if( u == null )
return;
try
{
work.doUpdate( u );
return true;
}
catch( OptimisticLockException ole )
{
return false;
}
}
public static void main(..) throws Exception
{
EntityManagerFactory emf = ...;
EntityManager em = null;
try
{
em = emf.createEntityManager();
UpdateUnitOfWork uow = new UpdateUnitOfWork() {
public doUpdate( User user )
{
user.setAge( 34 );
}
};
boolean success = exec( em, "petit", uow );
if( success )
return;
// retry 2nd time
success = exec( em, "petit", uow );
if( success )
return;
// retry 3rd time
success = exec( em, "petit", uow );
if( success )
return;
}
finally
{
em.close();
}
}
我的问题是您如何决定何时停止重试?
最佳答案
The question I have is how do you decide when to stop retrying ?
在我看来,同时修改同一个对象是一种异常(exception)情况,应该使用乐观锁。
现在,如果发生这种情况,并且该过程是手动的,我会警告用户修改无法保存,并要求他再次保存更改。
如果流程是自动化的,实现自动重试机制是有意义的,但我不会重试超过 3 或 5 次,具体取决于处理时间(并且我会使用递归调用来实现这个).如果一个自动化进程在并发访问问题上连续失败 5 次,那么它很可能与另一个自动化进程竞争,并且它们要么没有处理独立的数据 block (这不利于并行化),要么就是策略不正确正确的那一个。在这两种情况下,重试更多都不是正确的解决方案。
关于java - 应该如何处理 javax.persistence.OptimisticLockException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215919/
在我当前的项目中,我将 Spring Data JPA 与 Hibernate 一起使用,但认为这是一个更普遍的问题,也应该涵盖“普通”JPA。 我不确定我应该如何处理OptimisticLockEx
在选择查询中出现 OptimisticLockException javax.persistence.OptimisticLockException at org.hibernate.ejb.Abst
无法捕获乐观锁异常。 引发 OptimisticLockException 的一种方法是使用 em.flush() try{ //some enitity em.flush() } c
我有多个线程读取一个表。每个线程都想从表中读取一个值,然后将状态从 used = 'N' 更改为 used = 'Y'; Value = `Select min(myColumn) where use
我正在使用 Spring 和 Hibernate。我正在像这样运行 jUnit 测试: String number = invoiceNumberService.nextInvoiceNumber()
当我的应用程序中出现乐观并发问题时,我的应用程序中会抛出 StaleObjectStateException 而不是 OptimisticLockException (正如我所读到的,我应该期待这个)
我有以下代码 (OLE = OptimisticLockException) ... public void outer() { try { middle() } catch (OLE
假设我有一个带有版本字段(javax.persistence.Version 注释)的实体 bean AccountBean。在交易过程中,我的应用程序修改了这个实体并对其他实体执行数据库操作(插入和
我尝试在 Play 中使用 Ebean 更新数据库中的一行!框架程序。 这是我要更新的实体的类。 Transaction.java @Entity @Table(name = "transaction
我是 JPA 的新手,如果不清楚,请原谅我。 基本上我想通过使用乐观锁来防止并发修改。我已将 @Version 属性添加到我的实体类中。 我需要知道这个处理 OptimisticLockExcepti
这是我的代码: EntityManager em = JPAUtil.createEntityManager(); try { EntityTransaction tx = em.ge
我正在使用 JPA toplink-essential,构建 REST 网络应用程序。 我有一个 servlet,它可以找到一个实体并将其删除。 在代码下方,我认为我可以在 servlet 级别捕获乐
我们正在开发一个旨在每秒处理多个请求的网站。- 我们当前的环境是 JavaEE、JBoss 4.2.3、Struts2 for MVC、JPA,Hibernate 作为 ORM,Postgres 作为
我有一个使用 Ebean 的 Play 2.1.3 Java 应用程序。我在下面收到 OptimisticLockException。 [OptimisticLockException: Data h
所以,我在做一个简单的 Spring MVC + JPA (hibernate) 项目,其中有用户可以发布帖子并在他们的 friend 帖子上发表评论(有点像一个小型社交网络)。我对使用 JPA Hi
我在这里读了几个关于 JPA 的 OptimisticLockException 的问题,在无状态 session bean 中使用。它被抛出,但显然不在我预期的位置。 这是我希望得到异常的代码:
在 (REST) 网络服务中处理 OLE 的正确模式是什么?这就是我现在正在做的,例如, protected void doDelete(HttpServletRequest request, Htt
模型结构: @MappedSuperclass public class BaseModel implements Serializable, Comparable { private sta
我的问题 - 进程尝试更改已经更改并具有最新版本 ID 的实体。当我在 UnitOfWork 的 commit() 代码中执行 flush() 时,会出现 OptimisticLockExceptio
在 Web 应用程序中,我使用 Spring 4.3.9 和 Hibernate 5.2.10 作为 JPA 提供程序。 在一个 bean 中,我有以下类和方法: @Repository
我是一名优秀的程序员,十分优秀!