2011-03-25 79 views
10

我想通过1使用Hibernate来增加在数据库表中的字段。休眠:增加一个整型字段

我可以通过简单地加载一个对象,增加值和更新但对象如果另一个线程来临时,在负载和更新则该值将损坏之间更新的领域做到这一点。

所以不是我呼吁直接对数据库进行更新:

Query updateHits = createQuery(
    "UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId"); 
updateHits.setInteger("jobId", job.getId()); 
updateHits.executeUpdate(); 

但我的理解是,这绕过数据库中的乐观锁定和我目前SQL服务器遇到问题死锁,我相信这是罪魁祸首。

有没有办法来增加一个字段,而不直接调用和更新,同时保持数据的完整性?

+0

可能想检查您的锁是如何创建的。如果你正在为该更新获取表锁,则会出现问题。如果你得到一个行锁我不明白怎么回事造成死锁。 – BlackICE 2011-03-25 11:51:10

+0

我实际上设法解决死锁问题,只是确保此更新是在事务内运行的最后一条语句。不过,我仍然很想知道更好的解决方案。 – 3urdoch 2011-03-25 12:17:52

+1

您的“逐查询增量”解决方案比处理悲观锁定要好十倍,尤其是在您正在处理多线程和长时间运行的事务时 – kommradHomer 2014-10-28 16:10:25

回答

3

我可以通过简单地加载 对象,增加值和 但是更新对象如果另一个 线程走来,并在负载和 更新与更新 场则该值将成为做到这一点 损坏。

如果第二个线程还使用Hibernate,你在使用Hibernate的版本(@版本)的一个线程,承诺第一和改变对象将设置新版本的对象。

当第二个线程提交进来时,hibernate将检查乐观锁定失败并将抛出异常 - 如果我没有弄错StaleObjectException。将围绕你的并发代码catch块你就必须重新加载对象,并尝试更新,如果它是有道理的机会。如果您使用JPA,则会抛出OptimisticLockException。

有在Hibernate Optimistic Concurrency Control Section信息的负荷。

干杯!