11

Criteria API を使用して休止状態のオブジェクトのリストを取得しています。ただし、同時に実行されている別のスレッドが正確なオブジェクトを取得し、悲観的ロックがない場合はスレッドの 1 つだけが成功するため、これらのオブジェクトをロックする必要があります。

以下のようにしてみましたが、うまくいきません。

List esns = session
    .createCriteria(Reddy_Pool.class)
    .add(Restrictions.eq("status", "AVAILABLE"))
    .add(Restrictions.eq("name", "REDDY2"))
    .addOrder(Order.asc("id"))
    .setMaxResults(n)
    .setLockMode(LockMode.PESSIMISTIC_WRITE) //not working at all
    .list();

更新: このステートメントの後に更新を実行しているため、両方のスレッドが異なる行を読み取るか、少なくとも 2 番目のスレッドが最初のスレッドがトランザクションを完了してロックを離れるまで待機する必要があります。

そして、休止状態で生成されたクエリは以下のとおりです。

Hibernate: select this_.id as id1_0_, this_.name as name1_0_, 
this_.orderitem_id as orderitem3_1_0_, this_.status as status1_0_, 
this_.store as store1_0_, this_.vendor as vendor1_0_, this_.version as version1_0_ 
from reddy_pool this_ 
where this_.status=? and and this_.name=? order by this_.id asc limit ?

更新: Pascal Thivent (Pascal に感謝します) が言及したように、3.5.2 バージョンのバグのようです。私はメンバーとして参加し、問題を監視しています。うまくいけば、それは次のリリースに含まれます。

ただし、ここで別のアプローチを使用してみましたsession.buildLockRequest()...しかし、それを使用する方法がよくわかりませんでした。以下のコードを使用してもまったく効果がありません。

for (int i=0; i < n; i++)
    session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
4

1 に答える 1

4

どのバージョンのHibernateを使用していますか?これはHHH-5275でしょうか?FOR UPDATEステートメントが生成されていないことを確認しますか?生成されたSQLを表示できますか?

于 2010-06-12T12:11:04.710 に答える