1

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

2 回答 2

2

我建议改为乐观锁定。您将“版本”属性添加到您的对象,然后休眠在最后执行更新操作并验证版本在您读取对象后没有更改。通常比悲观锁定更好的设计(没有什么比找到那些数据库死锁!)。

当然,问题仍然存在,如果对象发生了变化,你打算怎么做?

于 2008-12-04T04:28:40.867 回答
0

您可以使用悲观锁虽然我不会这样做,但它可能对您的情况有用。

由于您的对象是从数据库中检索的,因此您必须锁定数据库,以便在您使用它时没有其他人修改您的对象。

为此,您应该锁定您的对象。

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()

于 2008-12-04T02:31:29.823 回答