[Mariadb] Lock wait timeout exceeded; try restarting transaction 원인과 해결방안, 격리레벨 변경 방법

이 에러는 다른 세션에서 이미 사용중인 테이블일때 Lock  을 거는데  그 Lock걸린 테이블에서 작업을 할때 기다리다가 시간초과 나서 나는 에러이다. 

 

대기시간은 아래 쿼리로 확인 할 수 있다. 

show variables like 'lock_wait_timeout';

 

 

솔직히 근본적인 에러는 해결이 어렵다. 첫번째 해결 방법으로 일단 첫번째로 할 수 있는 방법으로는 Lock 대기시간(lock_wait_timeout)을 늘려주는것이고 두번째로는 격리레벨을 낮추는 것이다.

 

[격리레벨 조회 방법]

디비 격리레벨(isolation level)은 트랜잭션 끼리 얼마나 영향을 미칠것인가 인데 높은 레벨일 수록 영향을 많이 미친다. 

격리레벨 수준은 크게 아래 4단계인데 기본적으로 마리아디비에서는 "REPEATABLE READ" 로 되어있다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

 

아래 쿼리 문으로 현재 DB의 격리레벨을 조회할 수 있다.

SELECT @@global.tx_isolation;

 

디비 락이 많이 걸려 "Lock wait timeout exceeded; try restarting transaction" 에러가 자꾸 발생한다면 꼭 정확한 데이터를 보여줄 필요성이 있는 금전적인 처리가 아니면 "READ COMMITTED"를 쓰기를 추천한다.

 

[격리레벨 수정 방법]

격리레벨 수정 방법은 my.cnf 파일에서 아래 내용을 추가하면 된다.  없으면 기본적으로 REPEATABLE-READ 이다.

 

 

만약에 DB Lock 이 걸려있는 상황이라 장애가 발생했다면 트랜잭션 Kill을 해줘야 하는데 방법은 아래 URL을 참조하면 된다.

DB Lock 확인 및 Kill 방법 :  https://deftkang.tistory.com/247

 

 

참고 : https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/

 

[db] 트랜잭션 격리 수준(isolation level)

트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다. 즉, 간단하게 말해 특정 트랜잭션이 다른 트랜잭션에

joont92.github.io

 

 

댓글

Designed by JB FACTORY