본문 바로가기
Dev/MySQL

[Database] Lock, Block, DeadLock

by 흰바다제비 2022. 9. 15.
728x90

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 문이 기존에 있는 인덱스를 사용하는지 확인한다.
  • 중첩 트랜잭션을 사용하는 경우 커밋 또는 롤백 충돌이 없는지 확인한다.

 

 


참고

 

Locks, blocks and deadlocks - what's the difference?

Michelle helps you ensure that you don't get caught confusing the meaning of locks, blocks or deadlocks.

blog.pythian.com

 

 

728x90

댓글