2016-03-04 21 views
0

我在我的java多线程项目中得到了org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):Hibernate Row被另一个事务更新或删除

我正试图在两个不同的线程内访问相同的数据库记录。我该如何解决这个问题。这是我有错误的方法,

@Override 
@Transactional 
public Gamedetail getByExternalGameIdAndSource(String id, String dataSource) { 
    return (Gamedetail) sessionFactory.getCurrentSession().createCriteria(Gamedetail.class).add(Restrictions.eq("externalgameid", id)) 
      .add(Restrictions.eq("datasource", dataSource)).uniqueResult(); 
} 

我知道hibernate会话不支持多线程。我使用本机SQL查询,但它给了我类抛出异常。提前感谢。

+0

是一些还是一个线程更新相同的记录?因为在读取记录时不应该得到'org.hibernate.StaleObjectStateException'。 – Bunti

+0

即使你可以修复它,但数据库不会允许你同时修改相同的记录/行 – AntJavaDev

+0

@Bunti两个线程同时运行,这两个线程有​​无限循环。所以一个循环正在创建gameDetail对象。如果您没有找到特定的gameDetail,则此方法将返回null,然后创建一个新的gameDetail记录并保存它,否则会更新它。其他线程试图访问gameDetail并尝试更新一些字段。 – Neero

回答

0

基于评论我会选择一个解决方案,你将有一个共享队列,两个线程将共享一个线程将保存/更新gameDetail对象到数据库。该单线程将处理对不存在记录的更新将简单地在数据库中创建一个的情况。您可以同步对此队列的访问,也可以使用线程安全并发队列,例如ConcurrentLinkedQueue

请记住,这种方法可能不会产生更好的性能,因为两个线程之间存在争用以访问共享队列。

相关问题