정의

여러 트랜잭션이 동시에 같은 데이터에 접근할 때, 데이터의 일관성을 보장하기 위해 자원에 잠금을 적용

락킹 전략

  1. 비관적 락(Pessimistic Lock)

    1. 충돌이 잦을 것이라고 가정
    2. 데이터를 읽는 순간 잠금 적용, 트랜잭션이 끝나면 해제
    // JPA 코드 예시
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    Account findById(Long id);
    
    // SQL문 예시
    SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
    
  2. 낙관적 락(Optimistic Lock)

    1. 충돌이 거의 없을 것이라고 가정
    2. 실제로 락을 걸지 않고 버전 체크로 충돌 감지
    3. 업데이트 시 버전이 다르면 예외 발생
    // JPA 코드 예시
    @Entity
    public class Account {
        @Id
        private Long id;
        
        @Version  // 버전 필드 선언하면 JPA가 관리
        private Long version;
        
        private BigDecimal balance;
    }
    
    // SQL 예시
    UPDATE inventory SET quantity = quantity - 1, version = version + 1
    WHERE product_id = 1 AND version = {버전}; // 버전 체크