[java] Hibernate에서 데이터베이스 로우(Row) 잠금(Lock) 설정하는 방법은?

Hibernate은 자바 기반의 ORM(Object-Relational Mapping) 프레임워크로, 데이터베이스와의 상호작용을 단순화하고 개발자가 객체지향적으로 데이터를 조작할 수 있도록 도와줍니다. Hibernate를 사용하면 여러가지 데이터베이스 조작 작업을 수행할 수 있지만, 가끔은 특정 로우(Row)를 다른 트랜잭션과의 충돌로부터 보호하기 위해 로우를 잠그는 기능을 사용해야 할 때도 있습니다. Hibernate에서 데이터베이스 로우를 잠금 설정하는 방법에 대해 알아보겠습니다.

Hibernate에서는 다음과 같은 방법으로 데이터베이스 로우를 잠급니다:

  1. Pessimistic Locking (비관적 잠금)
    • 한 트랜잭션이 로우를 잠근 상태에서 다른 트랜잭션이 그 로우에 접근하려고 할 때, 접근을 차단하고 대기하도록 설정합니다.
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
       
    // 데이터베이스 로우 잠금 설정
    session.get(SomeEntity.class, id, LockMode.PESSIMISTIC_WRITE);
       
    // 잠금이 설정된 로우에 대한 작업 수행
    // ...
       
    transaction.commit();
    session.close();
    
  2. Optimistic Locking (낙관적 잠금)
    • 트랜잭션은 로우를 변경하기 전에 해당 로우가 다른 트랜잭션에 의해 변경되지 않았는지 확인합니다.
    • 만약 다른 트랜잭션에서 해당 로우를 변경한 경우, 충돌을 감지하고 예외를 발생시킵니다.
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
       
    // 데이터베이스 로우를 가져올 때 Optimistic Locking을 설정
    SomeEntity entity = session.get(SomeEntity.class, id);
    session.lock(entity, LockMode.OPTIMISTIC_FORCE_INCREMENT);
       
    // 상태 변경을 수행 (확인 과정에서 버전이 증가됨)
    entity.setName("New Name");
       
    // 변경된 로우를 데이터베이스에 저장
    session.update(entity);
       
    transaction.commit();
    session.close();
    

이처럼 Hibernate에서는 Pessimistic Locking과 Optimistic Locking을 통해 데이터베이스 로우를 잠그는 기능을 제공합니다. 개발 시나리오에 따라 적절한 잠금 전략을 선택하여 데이터 정합성을 유지할 수 있도록 해야합니다.

더 자세한 내용은 Hibernate 공식 문서를 참조하시기 바랍니다.