티스토리 뷰

DeadLock


# Overview

이전 게시글에서 데드락의 개념에 대해 알아보았습니다. 데드락의 개념적 정의에 대해서는 쉽게 이해 하였지만 MySQL에서의 데드락은 어떻게 발생되는 것인지 이해하지 못하였습니다. 직접 데드락을 발생시켜 발생 조건과 원리에 대해 이해하려고 합니다.

 

# Tip

데드락을 2가지의 경우로 발생시켜 보려고 합니다.

1. Row 1개 사용

2. Row 2개 사용

이번 게시물에서는 Row를 1개 사용하여 데드락을 발생시키는 것이 목표입니다.

 

 

1. DeadLock 발생


[ DeadLock 실행 순서 ]

# 트랜잭션1
> START TRANSACTION;
> SELECT * FROM LOGIN_USER_DATA WHERE ID="5" LOCK IN SHARE MODE;

# 트랜잭션2
> START TRANSACTION;
> DELETE FROM LOGIN_USER_DATA WHERE ID="5";

# 트랜잭션1
> DELETE FROM LOGIN_USER_DATA WHERE ID="5";

 

 

2. 실험 결과


[ 결과 ]

트랜잭션2(오른쪽) DELETE 쿼리문을 실행하고 나서 데드락이 발생한 것을 확인할 수 있다.

트랜잭션1(왼쪽)은 DELETE 쿼리문이 정상적으로 실행된 것을 확인할 수 있습니다.

데드락 발생이후 트랜잭션1과 2에서 SELECT * FORM TABLE_NAME을 실행하여 어떻게 결과가 적용되었는지 확인해 보겠습니다.

 

트랜잭션2(오른쪽)에서는 DELETE FROM LOGIN_USER_DATA WHERE ID="5"; 이 적용되지 않고 ROLLBACK된 것을 ID 5번에서 확인할 수 있습니다.

 

트랜잭션1(오른쪽)은 DELETE FROM LOGIN_USER_DATA WHERE ID="5";이 적용되어 ID 5번이 삭제된 것을 확인하여 쿼리문이 정상적으로 COMMIT된 것을 확인할 수 있습니다.

 

 

즉, 데드락이 발생하게 되면 DBMS가 트랜잭션1 혹은 트랜잭션2 중 하나를 강제로 중지시켜 한 트랜잭션은 COMMIT되며 다른 트랜잭션은 실행을 중지시키고 변경된 데이터를 ROLLBACK하여 데드락을 해결하는 것을 확인할 수 있습니다.

 

 

DeadLock 발생 조건 설명 ]

 

데드락은 공통된 자원을 이용하기 위해 여러 개의 트랜잭션이 서로 lock을 걸어주다가 무한 대기 상태에 빠지는 것을 데드락이라 한다.

 

쿼리를 보면 트랜잭션1에서 (1)SELECT * FROM LOGIN_USER_DATA WHERE ID="5" LOCK IN SHARE MODE shared lock(공유 잠금)이 일어난 걸 알 수 있다. 이 후, 트랜잭션2에서 (2)DELETE FROM LOGIN_USER_DATA WHERE ID="5"; 작업을 하기 위해서는 exclusive lock(독점 잠금) 이 필요하기에 (1)의 잠금이 끝나길 기다리게 된다. 트랜잭션1는 (2)가 실행 된 후 같은 쿼리 (3)DELETE FROM LOGIN_USER_DATA WHERE ID="5";을 실행해야 되는데, 이 떄 (3)도 마찬가지로 독점 잠금이 필요하다. 하지만, 잠금 요청 대기열에는 이미 (2)의 요청이 들어와 있기에 (3)을 위해선 (2)가 끝나길 기다리게 된다.

 

(1) <- (2)
(2) <- (3)
(3) <- (1)

 

(1)의 잠금이 풀리기 위해선 트랜잭션이 끝나야 하는데, (3)의 잠금 대기때문에 트랜잭션을 끝낼 수가 없다. 즉, 1>2>3>1>2>3> ... >1>2>3 무한 루프에 빠지며 이것을 교착 상태, 즉 데드락이라 표현한다.

 

 

Innodb에서는 데드락이 발생하면 하나의 트랜잭션을 롤백시켜 데드락을 해결한 후 과정을 로그로 남긴다. 로그는 show engine innodb status 명령어를 통해서 확인 할 수 있다.

 

 

[ 시연 영상 ]

노트북이 오래되어 화면녹화가 불가능하였습니다. 글씨가 작아 알아보기 힘드시겠지만 어떻게 동작하는지 흐름과정만 참고해 주시면 감사겠습니다.

https://youtu.be/jIHbzmTEI88

 

[ Reference ]

https://moood.dev/db/mysql-innodb-deadlock/

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함