Lock

Karter·2022년 5월 17일
0

데이터베이스

목록 보기
5/8

db Lock 필요성

  • 같은 자원(데이터)에 대해서 동시에 접근하는 경우가 생길 수 밖에 없다.
    이럴 경우 데이터가 오염 될 수 있는데
    그렇게 되지 않도록 데이터의 일관성과 무결성을 유지해야할 필요가 있다.

Lock?

  • Lock이란 트랜잭션 처리의 순차성을 보장하기 위한 방법.
  • DBMS마다 Lock을 구현하는 방식과 세부적인 방법이 다르다. 따라서 DBMS를 효과적으로 이용하기 위해서는 해당 DB의 Lock에 대한 이해가 요구된다.

공유(Shared) Lock

  • 공유 Lock은 데이터를 읽을 때 사용되어지는 Lock.
  • 이런 공유 Lock은 공유 Lock 끼리는 동시에 접근이 가능.
  • 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다.
  • 공유 Lock이 설정된 데이터에 베타 Lock을 사용할 수는 없다.

베타(Exclusive) Lock

  • 베타 Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지된다.
  • 베타락은 Lock이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근할 수 없다.
  • 해당 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없습니다.

블로킹(Blocking)

  • 블로킹은 Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태.
  • 공유락 끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킨다. - 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)되어야 한다.
  • 뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능하다.
  • 성능에 좋지 않은 영향을 미친다. 따라서 경합을 최소화 할 필요가 있다.

교착상태(DeadLock)

  • 교착상태는 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태.
  • 교착상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게 하는것이 중요.
  • 위의 예제라면 프로그래밍을 할 때 game_master를 업데이트 한 후 game_detail을 업데이트 한다와 같은 규칙을 정해 테이블 접근의 교차가 일어나지 않도록 규칙을 정해놓고 설계.

db 프로그래밍 할 때 주의점

  • 한 트랜잭션의 길이를 너무 길게하는 것은 경합의 확률이 올라간다.
  • 처음부터 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야한다.
  • 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않는다.
  • 쿼리를 오랜시간 잡아두지 않도록 적절한 튜닝을 진행한다.
profile
미래 최고의 개발자

0개의 댓글