NDC/DB

[NDC 2014] 데이터베이스에서 데드락이란 무엇인가? (사례 포함)

MAKGA 2022. 12. 25. 00:09
320x100

교착 상태란?

서로 다른 둘 이상의 프로세서들이 상대 프로세서가 차지하고 있는 자원을 기다리는 무한 대기 상태


예1) 선착순 이벤트

원인: 변경 쿼리의 조건 구문 차이로 인해 페이지 접근 순서가 문제

단계:

  Session1 Session2
1단계 BEGIN TRAN
UPDATE 이벤트 SET 수량 = 수량 - 1 WHERE 이벤트번호 = 1
 
2단계   BEGIN TRAN
UPDATE 이벤트 SET 사용수량 = 사용수량 + 1 WHERE 계약번호 = 1
3단계 교착상태

개선: 접근 방향을 맞추기 위해 데이터 변경시 조건절을 동일한 기준으로 사용

지급과 사용에 대한 테이블 분리


예2) 조회 구문 변경

원인: 조회 구문에 컬럼을 추가하면서 데이터 페이지 접근이 필요하게 됨

  Session1 Session2
1단계 BEGIN TRAN
UPDATE tabl01 SET name = '1' WHERE idx = 1
 
2단계   SELECT name, registerdate FROM tabl01 WHERE idx = 1
3단계 교착상태

개선: 격리 수준 조정(Session2에 with(readuncommitted) 추가)

인덱스 조정 (인덱스에 신규로 초가된 컬럼 반영)


예3) 배치 작업

원인: 대량 데이터 조회시 해당 테이블에 변경이 발생하면서 발생

  Session1 Session2
1단계 INSERT INTO temp
SELECT * FROM tabl01
 
2단계   INSERT INTO tabl01 values (....)
3단계 교착상태

개선: 격리 수준 조정(Session1 구문에 with(readuncommitted) 추가)

 

대량 조회시 with(readuncommitted) 필수

대량 변경시 100 ~ 500건씩 처리


예4) 친구 추가

원인: 양방향 관계를 구성하기 위해 (A,B), (B, A)를 입력함

  Session1 Session2
1단계 BEGIN TRAN
INSERT INTO 친구 VALUES(A,B)
 
2단계   BEGIN TRAN
INSERT INTO 친구 VALUES(B,A)
3단계 INSERT INTO 친구 VALUES(B,A)  
4단계   INSERT INTO 친구 VALUES(A,B)
5단계 교착상태

개선: Deadlock 발생시 Application 재처리 로직 추가

Application 로직 변경 (1,2단계는 실시간, 3,4단계는 Queue 처리)


정리

교착 상태 예방을 위한 방법

- 같은 순서로 개체 접근

- 트랜잭션 내에 사용자 상호 작용 제거

- 낮은 격리 수준을 사용

- 행 버전 지정 기반의 격리 수준 사용


출처: http://ndcreplay.nexon.com/NDC2014/sessions/NDC2014_0071.html

320x100