[Database] DeadLock

AI 개발자 웅이·2022년 8월 19일
1

Database

목록 보기
5/5

DeadLock이란?

교착 상태(DeadLock)란 여러 개의 트랜잭션(Transaction)이 작업을 실행하지 못하고 서로 Lock이 풀리기만을 무한정 기다리는 상황을 말한다. 기본적으로 데이터베이스는 트랜잭션의 동시성을 제어하기 위해 로킹(Locking)이라는 방법을 사용하는데, 이것이 트랜잭션이 동시에 실행되는 것을 막아준다는 이점을 갖고 있지만 교착 상태를 일으킬 수도 있다는 문제점도 가지고 있다.

Exclusive Lock(배타적 lock or write lock)
어떤 트랜잭션에서 데이터를 변경할 때, 해당 트랜잭션이 완료될 때까지 다른 트랜잭션에서 해당 트랜잭션의 테이블 또는 레코드를 읽거나 쓰지 못하게 하는 방법

Shared Lock(공유 lock or read lock)
어떤 트랜잭션에서 데이터를 읽을 때, 다른 사용자가 테이블이나 레코드를 동시에 읽을 수 있게 하되, 변경은 불가능하게 하는 방법

DeadLock 예시

Transaction A가 Account 테이블의 레코드들에 lock을 걸고 트랜잭션을 완료하기 위해 Order 테이블의 레코드를 갱신하려고 한다. Transaction B는 Order 테이블의 레코드들에 lock을 걸고 트랜잭션을 완료하기 위해 Account 테이블의 레코드를 갱신하려고 한다. 이런 상황에서 Transaction A와 B는 Lock으로 인해 트랜잭션을 완료하지 못하고, 서로의 Lock이 풀리기를 무한정 기다린다.

DeadLock이 발생하면 테이블 update 시 timeout error가 발생하게 되고, api가 무한 대기 상태에 빠진다.

DeadLock 해결 방법

예방 기법
각 트랜잭션이 실행되기 전에 필요한 레코드를 모두 locking해주는 방법이다. 이 방법에서는 트랜잭션에 필요한 레코드가 많을 경우 전부 locking을 해줘야 하기 때문에 트랜잭션의 병행성을 보장하지 못한다. 또한 몇몇 트랜잭션은 계속해서 처리를 못하게 되는 기아 상태가 발생할 수 있다.

회피 기법
예방 기법의 단점 때문에 최근에 가장 많이 사용되는 방법이다. 자원을 할당할 때, timestamp를 사용하여 교착상태가 일어나지 않도록 한다. 회피 기법은 Wait-Die 방식과 Wound-Wait 방식으로 나뉜다.

Wait-Die 방식: 트랜잭션 A가 B에 의해 locking된 레코드를 요청할 때, A가 B보다 먼저 요청된 트랜잭션이라면 기다리고(wait), 나중에 요청된 트랜잭션이라면 포기한 후(die) 추후 다시 요청하는 방식이다.
Wound-Wait 방식: 트랜잭션 A가 B에 의해 locking된 레코드를 요청할 때, A가 B보다 먼저 요청된 트랜잭션이라면 해당 레코드를 선점하고(wound), 나중에 요청된 트랜잭션이라면 기다리는(wait) 방식이다.

Timestamp 기법
트랜잭션을 기준으로 하는 것이 아닌, 각 레코드의 시간 순서대로 제어하는 기법이다. 먼저 처리되고 있는 것에게 처리 순서를 양보하는 방법이다.

낙관적 병행 제어 기법
트랜잭션이 실행되는 동안에는 어떠한 검사도 하지 않고, 트랜잭션이 실행된 이후에 문제가 발생했다면 되돌리는 방법이다. 이 방법은 (1)판독 단계, (2)확인 단계, (3)기록 단계의 총 세 단계로 수행된다.

Reference
Deadlocks
데이터베이스 교착 상태(Dead Lock)
Transaction DeadLock

profile
저는 AI 개발자 '웅'입니다. AI 연구 및 개발 관련 잡다한 내용을 다룹니다 :)

0개의 댓글