2

「楽観的ロック」メカニズムを使用するのは初めてです-休止状態(Jboss内)とコンテナ管理トランザクション(CMT)を使用しています。エンティティの読み取りエンティティの更新の間に、他の誰かが DB の同じエンティティ (行) を更新するシナリオを処理したいと考えています。そのような場合、私は例外をスローしたい..

エンティティに @Version のアノテーションを付けました - のように

@Version
private Long version;

これでバージョン管理に十分かどうか、または EntityManager.lock() API を明示的に呼び出す必要があるかどうか、私は混乱しています。

  {
    .
    .
    final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id);
    entityManager.lock(queryDTO, LockModeType.READ);
    queryDTO.setStatus(updatedStatus);
    entityManager.persist(queryDTO);
  }

前もって感謝します、

4

1 に答える 1

7

@Version を介して楽観的ロックを使用する場合、明示的なロック (悲観的ロック) はまったく必要ありません。エンティティがデータベースに更新されると、次のようなクエリが実行されます。

UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99

更新が失敗した場合 (誰か/他の誰かがデータとバージョンを変更した場合)、取得しますOptimisticLockException(EntityManager を使用しているため、これは JPA に関するものであると思います。「生の」Hibernate では、StaleStateException のようなものである可能性があります)。

于 2011-03-15T06:00:46.880 に答える