JPAの悲観ロック

1308 ワード

JPA仕様では、3つのタイプの悲観的ロックが定義されています.
  • PESSIMISTIC_READ–共有ロックの取得とデータの更新または削除を許可する
  • .
  • PESSIMISTIC_WRITE–排他ロックの取得を許可し、データの読み取り、更新または削除を防止する
  • .
  • PESSIMISTIC_FORCE_INCREMENT–悲観PESSIMISTIC_WRITEと同様に、バージョン化エンティティのバージョン属性
  • が追加されました.
    いずれもLockModeTypeクラスに定義されています.
    // find
    entityManager.find(User.class, id, LockModeType.PESSIMISTIC_READ);
    
    // query
    entityManager.createQuery("from User where id = :id")
      .setParameter("id", id)
      .setLockMode(LockModeType.PESSIMISTIC_WRITE)
      .getResultList()
    
    // named query
    @NamedQuery(
      name="lockUser",
      query="select s from User s where s.id = :id",
      lockMode = PESSIMISTIC_READ
    )
    
    // Lock Scope
    Map properties = new HashMap<>();
    map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED);
    entityManager.find(User.class, 1L, LockModeType.PESSIMISTIC_WRITE, properties);
    
    // Setting Lock Timeout - milliseconds
    Map properties = new HashMap<>(); 
    map.put("javax.persistence.lock.timeout", 1000L); 
    entityManager.find(User.class, 1L, LockModeType.PESSIMISTIC_READ, properties);
    

    From Pessimistic Locking in JPA. Last modified: May 26, 2019