동시성 제어를 정리해 본다.
동시성 제어란?
동시에 실행되는 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법
의미가 잘 와 닿지 않는다. 배경을 알아보자
예시를 들어본다. 만약 영화 표를 예약한다고 생각해보자.
자리가 1개가 남았다. 그런데 만약 여러 명이 동시에 해당 자리를 예약한다면 어떤 현상이 일어날까?
당연히 가장 먼저 예매한 사람이 K24 번 자리를 갖게 될 것이다.
그러나 컴퓨터 시스템에서는 그렇지 않을 수 있다.
우리는 데이터를 변경하고 저장할 때 DB에 자료를 읽어와 수정하고 Commit 과정을 거치게 된다.
쉽게 말해, A가 데이터를 읽어오는 과정에서는 자리가 있었는데, 그 사이에 누군가가 예약한 줄도 모르고 예약이 진행된다면 영화관에서는 싸움이 일어날 것이다.
이제 다시 동시성 제어의 의미를 살펴보면 이해가 간다.
트랜잭션들이 동시에 수행될 때 -> 여러명이 동시에 예약할 때
일관성을 해치지 않도록 -> 여러 예약이 동시에 발생해서 일관성이 해쳐지지 않도록
트랜잭션의 실행 순서를 제어 -> 데이터 접근을 제어하여 충돌을 방지
이렇게 동시성 제어를 하지 않았을 때 생기는 일례를 들었다.
굳이 구분하자면 크게 4가지가 있다.
이것도 너무 복잡해 보인다.. 예시로 설명해 본다.
갱신 손실이 위의 영화관 예시이다. 자리가 예매되어 잔여석 = 0인 데이터가 갱신되기 전에, 두 트랜잭션이 동시에 잔여석 = 1을 읽고 수행하여 생긴 문제이다.
현황파악 오류는 A가 아직 예약을 완료하진 않았는데, 중간 데이터를 읽어온 B는 잔여석 = 0으로 판단하여 생기는 오류이다. A가 아직 Commit을 하지 않아서 Rollback을 하게 되어도, B는 진작에 포기해서 예약을 하지 않을 것이다. 이는 잘 일어나지 않는 오류라고 한다.
모순성
A가 한 좌석을 2만 원으로 예약한다. 그런데 결제 과정에서 영화관이 영화 값을 반값으로 할인하여 데이터를 처리한다고 가정한다. 이 경우 영화관의 데이터베이스에는 1명 * 10,000원으로 계산하여 1만 원의 수입이 기록된다. 그러나 실제로 A가 2만 원을 지불했기 때문에, 계좌를 확인하면 2만 원이 입금된 것을 확인할 수 있다.
이러한 상황에서 영화관의 데이터베이스는 실제 수입과 기록된 수입이 일치하지 않는 모순된 상태가 된다.
연쇄복귀
A사가 5천만 원을 주고 영화관을 통째로 대관했다. 기분이 좋은 영화관은 일주일 전부터 A사 직원들에게 팝콘과 음료 50% 이벤트를 진행했다. 그런데 A사가 코로나 발생을 이유로 계약을 파기(Rollback 요청)했다.
이렇게 되면 영화관도 이벤트를 철회해야 하고, 이를 통해 할인을 받은 고객들에게는 추가 요금을 청구할 수도 있다. 이는 굉장히 까다롭기도 하고 실제로 불가능할지도 모른다.
이처럼 Rollback 과정에서 이미 Commit 된 것이 있다면 회복 불능이 발생할 수도 있다.
👋 다음시간에는 동시성 제어 기법이 무엇이 있는지를 파악해 본다.👋