我有一个问题,我想使用Hibernate从数据库中读取对象,更改值,并保存对象。如果更改值需要一些时间,那么确保数据库中的基础对象没有更改的最佳方法是什么?我在一个事务(和一个会话)中这样做。
代码类似于:
// Load from DB
Criteria crit = session.createCriteria( Dummy.class ).add( Restrictions.eq("id", 5) );
Dummy val = crit.uniqueResult();
// Processing time elapses.
// Update value of dummy.
val.x++;
// Save back to database. But what if someone modified the row with ID = 5 in the meantime, and changed the value of x?
session.saveOrUpdate( val );
答案 0 :(得分:2)
我建议使用乐观锁定。您向对象添加“version”属性,然后hibernate在最后执行更新操作,并验证自您读取对象后版本没有更改。通常比悲观锁定更好的设计(就像发现那些db死锁一样!)。
当然,问题仍然存在,如果对象发生变化,您打算做什么?
答案 1 :(得分:0)
你可以使用悲观锁,虽然我不这样做,但它可能对你的情况有用。
由于您的对象是从数据库中检索的,因此您必须锁定数据库,以便在您使用它时没有其他人修改您的对象。
要做到这一点,你应该 lock 你的对象。
session.lock( myObject , LockMode.UPGRADE );
试一试。
修改强>
这可能更多你:
// Load from DB
Criteria crit = session.createCriteria( Dummy.class ).add( Restrictions.eq("id", 5) );
crit.setLockMode( LockMode.UPGRADE ); // issues a SELECT ... for UPDATE...
Dummy val = crit.uniqueResult();
etc.etc