我想使用Hibernate将数据库表中的字段增加1。
我可以通过简单地加载一个对象,递增值并更新对象来实现这一点,但是如果另一个线程出现并更新了加载和更新之间的字段,那么该值将被破坏。
所以我直接在数据库上调用了更新:
Query updateHits = createQuery(
"UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId" );
updateHits.setInteger( "jobId", job.getId() );
updateHits.executeUpdate();
但是我的理解是,这绕过了数据库中的乐观锁定,我目前遇到了SQL服务器死锁的问题,我相信这是罪魁祸首。
有没有办法在不直接调用更新的情况下增加字段并保持数据完整性?
答案 0 :(得分:4)
我可以通过简单地加载一个来完成 对象,递增值和 然而,如果另一个更新对象 线程出现并更新 在负载和之间的字段 更新然后值将成为 损坏。
如果第二个线程也在使用hibernate并且您正在使用hibernate版本控制(@Version),那么首先提交并更改对象的一个线程将在该对象上设置新版本。
当第二个线程提交进来时,hibernate将检查乐观锁定失败并将抛出异常 - 如果我没有弄错,则抛出StaleObjectException。如果一个catch块阻止你的并发代码,你将有机会再次加载该对象并尝试更新它是否有意义。如果您正在使用JPA,则会抛出OptimisticLockException。
Hibernate Optimistic Concurrency Control Section上有大量信息。
干杯!