🖥️ Back-end

데이터베이스 락(Lock) 이란?

승승장규 2025. 3. 31. 15:47

다중 사용자 환경에서 데이터의 일관성과 무결성을 유지하기 위해 사용되는 메커니즘으로, 여러 트랜잭션이 동시에 동일한 데이터에 접근할 때 발생할 수 있는 충돌을 방지하고, 데이터가 예상치 못하게 변경되거나 손상되는 것을 막는 역할을 한다.

즉, 한 트랜잭션이 특정 데이터에 대해 작업을 하고 있을 때 다른 트랜잭션이 그 데이터에 접근하지 못하도록 잠그는 것 이다.

 

비관적 락(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