다중 사용자 환경에서 데이터의 일관성과 무결성을 유지하기 위해 사용되는 메커니즘으로, 여러 트랜잭션이 동시에 동일한 데이터에 접근할 때 발생할 수 있는 충돌을 방지하고, 데이터가 예상치 못하게 변경되거나 손상되는 것을 막는 역할을 한다.
즉, 한 트랜잭션이 특정 데이터에 대해 작업을 하고 있을 때 다른 트랜잭션이 그 데이터에 접근하지 못하도록 잠그는 것 이다.
비관적 락(Pessimistic Locking) : 데이터에 대한 접근을 제어하기 위해 사용된다. 데이터베이스에서 특정 행이나 테이블에 대해 락을 걸어, 다른 트랜잭션이 동시에 동일한 데이터에 접근하거나 수정하지 못하게 한다.
// 공유 락
@Lock(LockModeType.PESSIMISTIC_READ)
@Query("select i from Item i where i.id = :id")
Item findByIdWithSharedLock(Long id);
// 배타 락
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select i from Item i where i.id = :id")
Item findByIdWithLock(Long id);
- PESSIMISTIC_READ: 읽기 락(Shared Lock)을 설정하면 다른 트랜잭션이 해당 데이터를 읽을 수는 있지만, 수정은 할 수 없다.
- PESSIMISTIC_WRITE: 쓰기 락(Exclusive Lock)을 설정하면 다른 트랜잭션이 해당 데이터를 읽거나 수정하지 못한다.
공유 락(Shared Lock)
- 읽기 락(Read Lock) 이라고 부르며, 공유 락이 걸린 데이터에 대해서 다른 트랜잭션에서도 공유 락을 획득할 수 있다.
- 배타 락(Exclusive Lock)은 획득할 수 없다.
- 트랜잭션 내에서 조회한 데이터가 변경되지 않는다.
배타 락(Exclusive Lock)
- 쓰기 락(Write Lock) 이라고 부르며, 배타 락이 걸린 데이터에 대해서 다른 트랜잭션에서는 공유 락과 배타 락을 획득할 수 없다.
- 배타 락을 획득한 트랜잭션은 데이터에 대한 독점권을 갖는다.

낙관적 락(Optimistic Locking) : 락을 걸지 않고 데이터 수정 시 충돌 여부를 확인해 처리한다.
- @Version 어노테이션을 추가해서 해당 엔티티의 수정 횟수를 추적하는 역할을 부여한다.
- 트랜잭션이 엔티티를 읽을 때, 현재의 버전 번호가 함께 읽혀온다.
- 트랜잭션이 엔티티를 수정하고 저장하려고 할 때, 현재 데이터베이스에 저장된 버전 번호와 트랜잭션이 처음 읽어온 버전 번호를 비교한다.
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
// 낙관적 락
@Version
private Integer version;
}
'🖥️ Back-end' 카테고리의 다른 글
Exception에 대해서 알아보자 (0) | 2025.04.02 |
---|---|
웹 소켓이란? (0) | 2025.04.01 |
자바의 Record 란? (1) | 2025.03.27 |
DDD (Domain Driven Design) : 도메인 주도 설계 도전 1일차 (1) | 2025.03.13 |
웹 사이트의 동작 원리 (0) | 2025.03.11 |