Lock
Lock은 프로세스가 데이터 조각에 액세스할 때 획득된다. 다른 프로세스가 이 데이터 조각을 동시에 필요로 할 가능성이 있는데, 데이터 조각을 잠그면 이러한 상황 발생시 해당 데이터에 대해 조치를 취할 수 있다.
예를 들어 데이터를 읽는 경우 일반적으로 최신 데이터를 읽도록 한다. 데이터를 업데이트하는 경우 다른 프로세스가 동시에 업데이트하지 않도록 해야 한다.
Block
Block (혹은 blocking lock)은 두 프로세스가 동일한 데이터 조각에 동시에 액세스해야 하는 상황에서, 한 프로세스는 데이터를 잠그고 다른 프로세스는 다른 프로세스가 완료되어 잠금을 해제할 때까지 기다려야 할 때 발생한다. 첫 번째 프로세스가 완료되는 즉시 차단된 프로세스가 작업을 재개한다. 차단 체인(blocking chain)은 queue와 같다. 즉, 차단 프로세스가 완료되면 다음 프로세스를 계속할 수 있다.
정상적인 서버 환경에서 block이 가끔 발생한다면 괜찮지만, block이 자주 발생한다면 일종의 설계 또는 쿼리 구현 문제가 있을 수 있으며 block으로 인해 단순히 성능 문제가 발생할 수 있다.
Block 상황을 간단히 설명하면 다음과 같다.
Block 상황은 자체적으로 해결되지 않거나(즉, 차단 프로세스가 트랜잭션을 제대로 완료하지 못한 경우) 완료하는 데 오랜 시간이 걸릴 수 있다. 이러한 극단적인 상황에서는 차단 프로세스를 종료하거나 다시 설계해야 할 수 있다.
Deadlock
Deadlock은 한 프로세스가 차단되어 두 번째 프로세스가 작업을 완료하고 잠금을 해제할 때까지 기다리는 반면, 동시에 두 번째 프로세스는 차단되어 첫 번째 프로세스가 잠금을 해제할 때까지 대기할 때 발생한다.
Deadlock 상황을 간단히 나타내면 다음과 같다.
Deadlock 상황에서는 프로세스가 이미 서로를 차단하고 있으므로, Deadlock을 해결하기 위해 외부 개입이 필요하다.
Block 이나 Deadlock의 발생을 줄일 수 있는 방법
- 사용량이 많은 테이블에는 클러스터형 인덱스(Clustered index)를 사용한다.
- 테이블 잠금을 유발할 수 있는 row 수가 많은 SQL 문을 적게 사용한다. 예를 들어, 한 테이블의 모든 행을 한 번에 다른 테이블로 삽입하는 대신 단일 INSERT 문을 루프에 넣고 한 번에 한 행을 삽입하면 방지에 도움이 될 수 있다.
- 긴 트랜잭션을 여러 개의 짧은 트랜잭션으로 나눈다.
- UPDATE 및 DELETE 문이 기존에 있는 인덱스를 사용하는지 확인한다.
- 중첩 트랜잭션을 사용하는 경우 커밋 또는 롤백 충돌이 없는지 확인한다.
참고
'Dev > MySQL' 카테고리의 다른 글
[MySQL] ERROR 2006 (HY000) : MySQL server has gone away (0) | 2022.10.07 |
---|---|
[MySQL] ERROR 1018 (HY000): Can't read dir of '.' (errno: 13) (1) | 2022.09.22 |
[MySQL] Dynamic SQL을 사용하여 프로시저 생성 (0) | 2022.09.04 |
[MySQL] yum으로 MySQL 설치 (CentOS 7) (0) | 2022.09.03 |
[MySQL] MySQL MMM (0) | 2022.07.26 |
댓글