dev.Log

데이터베이스 Lock 본문

BACKEND.*

데이터베이스 Lock

초코푸딩 2022. 10. 6. 17:25

<Lock의 종류>

낙관적잠금 : 데이터 갱신 시 경합이 발생하지 않을 것이라고 봄

-> 한 사용자가 업데이트를 완료하면, 동시 업데이트를 시도하는 다른 사용자들에게 충돌이 있음을 알림

 

비관적잠금 : 동일한 데잍터를 동시에 수정할 가능성이 높다라고 봄

-> 먼저 시도한 사용자가 변경을 완료해서 레코드 잠금을 릴리스할때까지 다른 사용자는 대기해야함

 

=> 낙관적 잠금은 동시 업데이트가 거의 없는 경우 사용하면 좋고

비관적 잠금은 동시 업데이트가 빈번한 경우와 외부 시스템과 연동한 경우 사용하면 좋다. 


<Lock 연산의 종류>

공용(shared) lock (S-lock)

- read 연산실행가능, write 연산 실행 불가능

- 데이터에 대한 사용권을 여러 트랜잭션이 함께 가질 수 있다. (s-lock 여러개 가능)

 

배타(exclusive) lock (X-lock)

- read 연산과 write 연산을 모두 실행 가능

- 베타 lock 연산을 실행한 트랜잭션만 해당 데이터에 대한 독점권을 가짐


 <Lock의 단위>

데이터베이스 > 파일 > 레코드 > 필드

왼쪽으로 갈수록 구현이 단순하고 병행성이 떨어지고

오른쪽으로 갈수록 구현이 복잡하고 병행성이 높아진다. 


<Lock으로 발생할 수 있는 문제점 - 블로킹, 데드락>

블로킹(Blocking) : Lock 들의 경합이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰선 상태

- 데이터에 대해서 하나의 트랜잭션이 베타 lock을 걸면 다른  트랜잭션들은 어떠한 lock도 걸지 못하고 대기해야한다.

- 트랜잭션이 commit 또는 rollback을 할 때 블로킹이 해제된다.

 

>> 블로킹 해결방법 

- 트랜잭션을 짧게 정의한다.

- 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 설계한다.

- Lock timeout을 이용하여 잠금해제 시간을 조절한다.

 

교착상태(DeadLock) : 한정된 자원을 여러 곳에서 사용하고자해 무한대기가 발생하는 상황

>> 교착상태 해결방법

- 트랜잭션 진행방향을 같은 방향으로 처리

- 트랜잭션 처리 속도를 최소화

- Lock timeout을 이용하여 잠금해제 시간을 조절


출처:https://www.youtube.com/watch?v=ZXV6ZqMyJLg

 

 

'BACKEND.*' 카테고리의 다른 글

컴파일과 빌드  (1) 2022.10.08
동시성 제어  (0) 2022.10.07
인증과 인가  (0) 2022.09.30
Spring Batch의 스케일링  (0) 2022.09.29
Spring Batch  (1) 2022.09.29
Comments