카테고리 없음

DB Lock

개발기록 2024. 9. 2. 19:57

본 포스팅은 DB Lock에 대해서 포스팅 하고자 한다.

 

Lock이란


Lock이란 데이터베이스에서 동시성과 데이터 일관성을 보장하기 위해 사용되는 메커니즘이다.

 

예를 들어, 여러 사용자(트랜잭션)들이 동시에 같은 데이터에 접근하려고 할 때

데이터베이스는 Lock을 사용하여 해당 데이터를 사용하고 있는 사용자(트랜잭션)와 다른 사용자(트랜잭션)들 간의 접근을 제어하여 충돌을 방지한다.

 

Lock의 종류


Lock의 종류에는 크게 공유 락 (Shared Lock)과 베타 락 (Exclusive Lock)이 있으며, 

공유 락은 다른 말로 Read Lock 이라고 불리며 베타 락은 Write Lock 이라고 불린다

 

- 공유 락 (Shared Lock)

공유 락은 데이터를 변경하지 않는 읽기 명령에 대해 주어지는 락으로서 Read Lock이라고도 불린다.

  • 여러 사용자가 동시에 데이터를 읽어도 데이터 일관성에는 아무런 영향을 끼치지 못하기 때문에 공유 락끼리는 동시에 접근이 가능하다. 하지만 공유 락이 설정된 데이터에 베타 락을 사용할 수는 없다.

 

- 베타 락 (Exclusive Lock)

베타 락은 데이터에 변경을 가하는 명령들에 대해 주어지는 락으로 Write Lock으로 불리며, X로 표기한다.

  • 베타 락은 이름 그대로 Lock이 해제될 때까지 다른 트랜잭션에서 해당 자원에 대한 접근 (Select, Insert, Delete, Update) 하는 것을 막는다.
  • 그리고 베타 락은 트랜잭션이 완료될 때까지 유지되고 또한, 공유 락과 달리 다른 트랜잭션이 수행하고 있는 데이터에 대해 접근하여 함께 Lock을 설정할 수 없다

 

 블로킹 (Blocking) & 교착 상태 (DeadLock)


- 블로킹 (Blocking)

 

블로킹은 Lock 간 (베타-베타, 베타-공유)의 경합이 발생하여 특정 트랜잭션이 작업을 진행하지 못하고 멈춰선 상태를 말한다.

  • 위에서 설명했다싶이, 공유 락 끼리는 블로킹이 발생하지 않지만 베타 락은 블로킹을 발생시키므로 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료 (commit 또는 rollback) 되어야 한다.
  • 이후에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능하기 때문에 이러한 경합은 성능에 좋지 않은 영향을 미치므로 경합을 최소화 할 필요가 있다.

[참고] 데이터베이스 시스템을 사용하는 시스템에서의 주의 사항

① 한 트랜잭션의 길이(시간)를 너무 길게 하는 것은 위에서 말한 것처럼 경합의 확률을 올리게 되므로 설계할 때, 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야 한다.

 

② 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않도록 해야 하는데, 이는 데이터 일관성을 향상시키지만 반대로 동시성이 떨어져 블로킹 상태가 다수 발생할 수 있다.

 

③ Query를 오랜시간 잡아두지 않도록 시스템 환경에 맞추어 DB에서의 적절한 튜닝을 진행하도록 한다.

 

- 교착 상태 (DeadLock)

 

교착 상태는 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻고자 할 때, 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태를 말한다.

  • 위의 그림처럼 트랜잭션 A는 game_master 테이블에 베타 락을 설정하였고 트랜잭션 B는 game_detail 테이블에 베타 락을 설정하였다.
  • 이후에 트랜잭션 A는 game_detail 테이블에 트랜잭션 B는 game_master 테이블에 락을 설정하려고 시도하나 이미 각각의 테이블은 서로 다른 트랜잭션에 의해 베타 락이 설정되어 있기 때문에 트랜잭션 A, B는 Lock이 해제되기를 서로 기다리는 상태가 된다.
  • 하지만 이 Lock은 풀리지 않을 서로의 트랜잭션을 기다리므로 영원히 풀리지 않는 데드락 상태가 되어버린다.
  • 따라서, 교착 상태가 발생하면 DBMS에서는 둘 중 한 트랜잭션에 에러를 발생시킴으로써 데드락 문제를 해결하며 교착 상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게 하는 것이 중요하다.
  • 즉, 위의 예제를 예로 든다면 game_master 테이블을 업데이트 한 후에 game_detail 테이블을 업데이트 한다와 같은 규칙을 통해 테이블 접근의 교차가 일어나지 않도록 함으로써 교착 상태를 예방하는 것이다.

참조 : https://shuu.tistory.com/88

 

DB Lock 기초

1) DB Lock 기초 (1) Lock이란 Lock이란 데이터베이스에서 동시성과 데이터 일관성을 보장하기 위해 사용되는 메커니즘이다. 예를 들어, 여러 사용자(트랜잭션)들이 동시에 같은 데이터에 접근하려고

shuu.tistory.com