본문 바로가기
[오류]

[Dead lock]이 발생했다!!!!!!

by 뽀도 2024. 5. 2.

개발 서버에서 갑자기 deadlock 메시지가 날라와 확인해 보았다.

 

[에러 메시지]


Error: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction...

 

에러 내용을 자세히 적을 수는 없지만 데드락이 발생하였고, 무슨 내용인지 자세하게 확인하기 위해 mysql에 아래의 쿼리를 날려 내용을 확인 해봤다. 


[상태 확인 쿼리]

SHOW ENGINE INNODB STATUS;


위의 쿼리를 적으면 어디서 데드락이 발생했는지, 어떤 트랜잭션이 문제가 됐는지 설명이 쭈욱 나온다. 

 

*** (1) TRANSACTION:
 TRANSACTION 60930153, ACTIVE 0 sec inserting
  mysql tables in use 12, locked 12
  
 LOCK WAIT 28 lock struct(s), heap size 3488, 16 row lock(s), undo log entries 2
 MySQL thread id 134928, OS thread handle 139913060153088, query id 93502708


........

생략 


 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: 

RECORD LOCK  ◆  index ◆ of table ◆ lock_mode x insert intention wating 
Record lock, heap no.. 

 

내용을 확인해 보았을때, insert 하다가 문제가 발생한 것으로 추측이 되었다. 

 

그나마 다행인거는 라이브 실행환경에서 문제가 한번도 발생하지 않은것?? 

여기 저기 물어보고 내린 해답은 아래와 같다. 

 



1. 문제를 야기 시킨 sp와 프로그램 로직 수정 


=> 해당 sp내에서 select 후 update 하거나 insert를 하는데, 앞단 코드가 이미 많이 변경 되었기 때문에

내부에서 select를 또 할 필요는 없을꺼 같다. 그러니까 insert를 해주는것이 좋을듯 하다. 

=> 지금은 for문돌아서 insert를 반복하는데, 한번에 bulk 처리하는것도 방법

 

2. 지켜보기
=> 라이브에서는 한번도 발생한적이없는데, QA 서버에서 한번 발생한거는 QA 서버의 성능 문제일 수 도 있으니 일단 두고 본다. 

 

 

1번을 목표로 두고 다음 업데이트 때 들어가게 처리해야겠다. 

 

 

 

 

 

참고)

 

https://lingi04.tistory.com/4

 

Deadlock 현상 해결

고객사로부터 특정 요청이 간헐적으로 실패가 난다는 이슈가 접수되었다. 로그를 확인해보니 Deadlock exception 발생하고 있었고 이슈를 해결하며 찾아보며 알게된 것들을 정리한다. 환경 DB MariaDB E

lingi04.tistory.com

 

 

 

 

반응형

댓글