自从我阅读以来,我如何确保使用Hibernate更新的值没有被更改?

时间:2008-12-04 02:08:58

标签: java sql multithreading hibernate transactions

我有一个问题,我想使用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 );

2 个答案:

答案 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

Criteria.setLockMode()