> 작성일 : 2015-10-05
> OS : CentOS
특정 테이블에 쿼리 실행시 데드락이 발생하였다.
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]
mysql의 경우 오라클과 다르게 유니크 인덱스나 일반 인덱스가 걸리지 않았다면 전체 테이블을 읽기 때문에 전체에 락이 걸리게 된다는 점을 적용해야 한다. 즉, field1=? and field2=? 조건에 결합인덱스가 걸려있지 않다면 전체 테이블에 락을 건 상황에서 다른 사용자가 테이블을 수정하려 하였다면 데드락이 발생한다.
* 유니크 인덱스는 완벽한 row 단위 락이 걸림
* 일반 인덱스는 참조 했던 row가 모두 락이 걸림
* 인덱스가 없어 테이블 전체를 읽으면 모든 row가 락이 걸림
field1=? and field2=? 두개 필드에 대한 결합 인덱스를 생성한다.
Tags : development, database, memcached, troubleshooting