1

Hibernate を使用してデータベースからオブジェクトを読み取り、値を変更し、オブジェクトを保存したいという問題があります。値の変更に時間がかかる場合、データベース内の基になるオブジェクトが変更されていないことを確認する最善の方法は何ですか? これを 1 つのトランザクション (および 1 つのセッション) で行っています。

コードは次のようになります。

// 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

代わりに楽観的ロックをお勧めします。オブジェクトに「version」プロパティを追加すると、hibernateは最後に更新操作を実行し、オブジェクトを読み取ってからバージョンが変更されていないことを確認します。一般に、悲観的なロックよりもはるかに優れた設計です(これらのdbデッドロックを見つけるようなものはありません!)。

もちろん、問題は残ります。オブジェクトが変更された場合、何をする予定ですか?

于 2008-12-04T04:28:40.867 に答える
0

私はそうしませんが、悲観的なロックを使用することはできますが、あなたの場合には役立つかもしれません。

オブジェクトはDBから取得されるため、DBをロックして、作業中に他の人がオブジェクトを変更しないようにする必要があります。

これを行うには、オブジェクトをロックする必要があります。

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 に答える