티스토리 뷰

데이터베이스(DB) Lock

동시성 제어를 위해 사용되는 중요한 메커니즘

여러 사용자가 동시에 같은 데이터에 접근할 때, 데이터 충돌을 방지하고 데이터의 일관성과 무결성을 유지하기 위해 데이터베이스 락을 사용

 

 

잠금 적용의 범위

  1. 데이터베이스(Database) : 데이터베이스 백업/복구 또는 스키마 변경 작업을 수행
  2. 테이블(Table) : 데이터베이스 내 모든 테이블에 락 설정, 주로 대규모 작업 및 테이블 구조 변경 시 사용
  3. 페이지(Page) : 디스크나 메모리에서 관리되는 데이터 블록 = 페이지, 특정 범위에 대한 락 설정
  4. 행(Row) : 특정 데이터 행에 락 설정, 여러 트랜잭션이 같은 테이블 내 서로 다른 행 작업 가능, 주로 읽기/쓰기 혼합 트랜잭션 유리
  5. 컬럼(Column) : 매우 세밀한 범위로 락 설정, 대부분의 DBMS에서는 지원하지 않음 
동시성 : 컬럼(많음) > 행 > 페이지 > 테이블 > 데이터베이스(적음)
복잡성 : 컬럼(높음) > 행 > 페이지 > 테이블 > 데이터베이스(낮음)

 

데이터베이스(DB) Lock 종류

1. 낙관적 락(Optimistic Lock)

-  동시성 이슈가 생길 때 처리

-  수정할 때 수정한다고 명시하여 다른 트랜잭션이 동일 조건 값으로 수정하지 못하게 하는 것

-  락을 사용하지 않고 일반적으로 version 또는 timestamp를 보고 변경 여부 확인 후 처리하며 버전 정보가 변경되지 않았다면 데이터를 수정하고 버전을 증가, 버전이 변경되었다면 충돌이 발생한 것으로 간주하고 롤백

-  동시성 이슈가 발생했을 때 DB가 아닌 애플리케이션 단에서 처리

-- 데이터 조회 시 현재 버전 정보를 가져옴
SELECT id, name, version
FROM student
WHERE id = 1;

-- 데이터 수정 시 버전을 검증
UPDATE student
SET name = 'Jane', version = version + 1
WHERE id = 1 AND version = 2;

-- 버전이 일치하지 않으면 업데이트 실패

 

 

≫ JPA에서의 낙관적 락 

@Version 어노테이션을 통해 낙관적 락 사용 !

낙관적 락이 발생하는 경우 ObjectOptimisticLockingFailureException 예외가 발생하고 이를 애플리케이션 단에서 처리

 

2. 비관적 락(Pessimistic Lock)

-  비관적 락의 구체적인 동작 형태로는 공유 락, 베타 락이 존재

-  Repeatable Read 또는 Serializable 정도의 격리성 수준을 제공

-  장시간 트랜잭션이 유지되면 데드락 현상 발생 가능성 ↑

-- 수정 작업을 위한 배타 락 설정
SELECT id, name
FROM student
WHERE id = 1
FOR UPDATE;

-- 락이 걸린 상태에서 데이터 수정
UPDATE student
SET name = 'Jane'
WHERE id = 1;

-- 트랜잭션 종료 후 락 해제
COMMIT;

 

  1. 공유 락(Shared Lock, S Lock)
    -  Read Lock이라고도 하며 데이터 읽기 전용 잠금
    -  Read Lock을 하게 되면 락을 획득한 데이터는 INSERT, UPDATE, DELETE 작업이 불가
    -  여러 트랜잭션이 공유 락을 걸 수 있으며 대신 조회 외 작업은 불가

  2. 베타 락(Exclusive Lock, X Lock)
    -  Write Lock이라고도 하며 데이터 쓰기 전용 잠금
    -  Write Lock을 하게 되면 수정 중인 트랜잭션 외에 어떠한 트랜잭션의 조회 및 수정 작업 모두 불가

 

 


 

비관적 락의 특징인 락을 통한 동시성 제어로 인해 발생하는 대표적인 2가지 문제

 

1. Blocking (블로킹)
한 트랜잭션이 특정 데이터에 락을 설정한 상황에서 다른 트랜잭션이 같은 데이터에 접근하려고 하면 대기 상태가 발생하는데 이 때 락이 해제될 때까지 다른 트랜잭션이 블로킹되어 다른 트랜잭션의 개입을 막는 것
트랜잭션 간 충돌이 많아질 수록 락이 해제될 동안 Latency가 길어지는 현상 발생 가능

 

[참고]

- set lock_timeout 0 : 블로킹이 걸려있으면 곧바로 종료

- set lock_timeout -1 : 블로킹이 걸려있으며 해지될 때까지 무작정 기다림 (기본값)

 

2. Deadlock (데드락 = 교착상태)

두 개 이상의 트랜잭션이 서로 상대방이 보유한 락을 기다리면서 무한 대기에 빠질 때 발생

 

[발생조건]

- 상호 배제

- 점유와 대기

- 비선점

- 환형(순환) 대기

 

해결하기 위한 방법은 없으며 회피, 예방, 탐지 및 복구 전략으로 상황에 맞는 방식을 적용

 

 

 

 

 

 

 

 

 

 

[참조]

https://datacodingschool.tistory.com/100

https://velog.io/@bagt/Database-%EB%82%99%EA%B4%80%EC%A0%81-%EB%9D%BD-%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD