[문제해결] java.sql.SQLException: Deadlock found when trying to get lock; try restarting transaction Query: update … 2015-10-05

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=? 두개 필드에 대한 인덱스를 생성한다.