교착상태

유재우·2023년 1월 4일
0

CS공부

목록 보기
24/26

교착상태(데이터베이스)

여러 개의 트랜잭션들이 실행을 하지못하고 서로 무한정으로 기다리는 상태

로킹(locking)

트랜잭션들의 '동시성'을 제어하기 위한 기법

로킹(locking)이 데이터가 엉망이 되는 것을 막아주는 반면, 부작용으로 교착 상태를 일으킬 수 있다.

트랜잭션

여러개의 작업을 하나의 논리적 단위로 묶어 반영과 원상복귀를 조정할 수 있기 위해 사용

논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우엔
원상태로 복구하여 작업의 일부만 적용되는 현상이 발생하지 않게 만들어 주는 기능


교착상태를 해결하는 방법

예방기법

트랜잭션이 실행되기 전에 필요한 데이터를 모두 로킹(locking) 해주는 방법

데이터가 많이 필요하면 사실상 모든 데이터를 전부 로킹 해주어야 하여 트랜잭션의 '병행성'을 보장하지 못한다. 뿐만 아니라 몇몇 트랜잭션은 계속해서 처리를 못하게 되는 기아 상태가 발생할 수 있다.

ex)

  • SET LOCK_TIMEOUT 문을 통해 일정 시간이 지나면 쿼리를 취소

회피기법

자원을 할당할 때 시간 스탬프(Time Stamp)를 사용하여 교착상태가 일어나지 않도록 회피하는 방법

이런 회피기법으론 Wait-Die 방식, Wound-Wait 방식이 있다.

Wait-Die

트랜잭션 Ti가 Tj에 의해 로킹된 데이터를 요청할 때 Ti가 먼저 들어온 트랜잭션이라면 기다리는 반면, Ti가 나중에 들어온 트랜잭션이라면 포기(Die)하고, 나중에 다시 요청

즉, 다른 트랜잭션이 데이터를 점유하고 있을 때 기다리거나(Wait) 포기(Die)하는 방식

Wound-Wait

트랜잭션 Ti가 Tj에 의해 로킹된 데이터를 요청할 때 Ti가 먼저 들어온 트랜잭션이라면 데이터를 선점(Wound)하는 반면, Ti가 나중에 들어온 트랜잭션이라면 기다린다.(Wait)

즉, 다른 트랜잭션이 데이터를 점유하고 있을 때 빼앗거나(Wound) 기다리는(Wait) 방식


낙관적 병행 기법

트랜잭션이 실행되는 동안에는 아무런 검사를 하지 않고, 
트랜잭션이 다 실행된 이후에 검사 후 문제가 있다면 되돌리는 방법

판독->확인->기록 단계를 따른다.
확인 단계를 성공적으로 거친 트랜잭션만 기록 단계를 수행할 수 있다.


교착상태의 빈도 낮추는 방법

  • 트랜잭션을 자주 커밋
  • 트랜잭션들이 동일한 테이블 순으로 접근하게 함
  • 읽기 잠금 획득( SELECT ~ FOR UPDATE)의 사용을 피함
  • 테이블 단위의 잠금을 획득해 갱신을 직렬화

참고한 블로그 링크

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글