[java] Hibernate에서 데이터베이스 로우(Row) 잠금(Lock) 설정하는 방법은?
Hibernate은 자바 기반의 ORM(Object-Relational Mapping) 프레임워크로, 데이터베이스와의 상호작용을 단순화하고 개발자가 객체지향적으로 데이터를 조작할 수 있도록 도와줍니다. Hibernate를 사용하면 여러가지 데이터베이스 조작 작업을 수행할 수 있지만, 가끔은 특정 로우(Row)를 다른 트랜잭션과의 충돌로부터 보호하기 위해 로우를 잠그는 기능을 사용해야 할 때도 있습니다. Hibernate에서 데이터베이스 로우를 잠금 설정하는 방법에 대해 알아보겠습니다.
Hibernate에서는 다음과 같은 방법으로 데이터베이스 로우를 잠급니다:
- Pessimistic Locking (비관적 잠금)
- 한 트랜잭션이 로우를 잠근 상태에서 다른 트랜잭션이 그 로우에 접근하려고 할 때, 접근을 차단하고 대기하도록 설정합니다.
Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 데이터베이스 로우 잠금 설정 session.get(SomeEntity.class, id, LockMode.PESSIMISTIC_WRITE); // 잠금이 설정된 로우에 대한 작업 수행 // ... transaction.commit(); session.close();
- 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 공식 문서를 참조하시기 바랍니다.
- Hibernate 공식 문서: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#locking