반응형
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=? 두개 필드에 대한 결합 인덱스를 생성한다.
반응형
'Tip' 카테고리의 다른 글
[Tip | Git] detected dubious ownership in repository (0) | 2025.01.22 |
---|---|
[Tip | Memcached] MemcachedClient getClient Exception (0) | 2025.01.14 |
[Tip | Linux] Can't create/write to file ... (Errcode: 28 - No space left on device) (0) | 2025.01.10 |
[Tip | Tomcat] Several ports ... already in use. (0) | 2025.01.09 |
[Tip | iOS] Device UDID 확인 (0) | 2025.01.05 |