데이터베이스의 병행제어
병행제어란 ?
- 여러개의 트랜잭션이 동시에 수행될 때 DB의 일관성을 파괴하지 않도록 트랜잭션간의 상호작용을 제어하는 것
- 병행(concurrency)는 매우 빠르게 여러 트랜잭션 사이를 이동하면서 조금씩 처리를 수행하는 방식
병행 제어의 목적은 일관성 외에도,
- DB 공유도 최대화, 시스템 활용도 최대화, 사용자 응답 시간 최소화 등이 있다.
병행 제어를 하지 않을 경우 트랜재션들이 동시에 DB에 접근하며 문제가 생긴다.
병행제어에 실패한다면
갱신 분실 (Lost Update)
- 같은 데이터에 둘 이상의 트랜잭션이 동시에 갱신할 때, 갱신 결과의 일부가 없어지는 것.
- 동일한 데이터 X에 값을 더하는 두 트랜잭션이 있을 때, 후행하는 트랜잭션은 선행 트랜잭션 값이 더해지기 전의 값을 받아오기에 두 트랜잭션이 올바르게 반영되지 않는 상황.
모순성 (Inconsistency)
- 하나의 트랜잭션이 여러 데이터 갱신을 수행할 때, 일관성 없는 상태의 DB에서 데이터를 가져와 데이터에 불일치가 발생하는 현상
- 갱신 분실과 비슷하지만, 한 트랜잭션이 여러 값을 연산하게 될 경우 각 값이 참조하는 시기가 모두 달라 데이터의 불일치가 발생
- 트랜잭션 1이 X, Y 값을 X->Y 값 순서로 갱신할 때 그 사이에 X, Y값을 갱신하는 또 다른트랜잭션 2가 개입해 트랜잭션 1의 일관성이 깨지는 상황
연쇄 복귀(Cascading Rollback)
- 병행 수행되던 둘 이상의 트랜잭션 중, 하나의 트랜잭션만 실패했지만 두 트랜잭션 모두 복귀되는 현상
비완료 의존성 (Uncommitted Dependency)
- 하나의 트랜잭션 수행이 실패 후 회복하기 전에 다른 트랜잭션이 실패한 결과를 참조
병행제어 기법
로킹
타임스탬프
- 데이터에 접근하는 시간을 미리 정해 시간 순으로 접근.
- 직렬 가능성을 보장하지만, 연쇄 복귀를 초래할 수 있음.
낙관적 병행제어
- 트랜잭션 종료 시 일괄적으로 검사
- 트랜잭션을 위해 유지되는 로컬 사본에 대해서만 갱신
다중 버전 병행제어
- 여러 버전 값을 유지하며 조회 성능을 최대한 유지하기 위한 방법
- 트랜잭션이 충돌할 경우 대기가 아니라 롤백함으로써 연쇄복귀초래 가능성O
로킹(Locking)
로킹이란?
- 병행 수행되는 트랜잭션들이 동일한 데이터에 동시에 접근하지 못하게 하여 직렬 가능성을 보장한다.
- lock, unlock 연산을 이용해 제어
- 로킹되는 단위가 커지면 트랜잭션 데이터 단위(로크)가 커져 수가 줄어들고 제어기법이 간단해져 병행성이 감소
- 반대로 로킹 단위가 작아져 병행성이 증가하지만 제어기법이 까다로워진다.
직렬 가능성 ? 트랜잭션들이 병행 수행되더라도 순차적으로 수행된 것과 동일한 DB 일관성을 보장하는 것
데드락 ? 2개 이상의 트랜잭션이 서로 상대방이 보유하고 있는 로크를 요청하면서 기다리고 있는 상태
'개발' 카테고리의 다른 글
자바 - checked Exception, unchecked Exception (0) | 2022.12.22 |
---|---|
[북TIL] 파이썬 알고리즘 인터뷰 7장 배열 (0) | 2022.08.11 |
인터페이스 모듈 연계 방식 EAI와 ESB (0) | 2022.07.14 |
비전공자 정보처리기사 필기 합격 후기 (0) | 2022.03.07 |
파이썬 EOF error feat. 백준 10951번 A+B - 4 (0) | 2022.02.15 |