Opendocs Logo

[Tip | MySQL] MySQL Deadlock found when trying to get lock

java.sql.SQLException: Deadlock found when trying to get lock; try restarting transaction Query: update …


> 작성일 : 2015-10-05
> OS : CentOS


<1> 문제상황

특정 테이블에 쿼리 실행시 데드락이 발생하였다.

java.sql.SQLException: Connection is closed.
java.sql.SQLException: Deadlock found when trying to get lock; try restarting transaction Query: update table set ... where field1=? and field2=?  Parameters: [test1,test2]



<2> 문제확인

mysql의 경우 오라클과 다르게 유니크 인덱스나 일반 인덱스가 걸리지 않았다면 전체 테이블을 읽기 때문에 전체에 락이 걸리게 된다는 점을 적용해야 한다. 즉, field1=? and field2=? 조건에 결합인덱스가 걸려있지 않다면 전체 테이블에 락을 건 상황에서 다른 사용자가 테이블을 수정하려 하였다면 데드락이 발생한다.

* 유니크 인덱스는 완벽한 row 단위 락이 걸림
* 일반 인덱스는 참조 했던 row가 모두 락이 걸림
* 인덱스가 없어 테이블 전체를 읽으면 모든 row가 락이 걸림



<3> 문제해결

field1=? and field2=? 두개 필드에 대한 결합 인덱스를 생성한다.



Tags : development, database, memcached, troubleshooting



AD
ⓒ Opendocs. All Rights Reserved.