현재 프로젝트의 예약 프로세스를 요약하자면 아래와 같다.
현재 MySQL을 사용하고 격리수준은 REPEATABLE READ을 사용중이기에 2명 이상의 유저가 동시에 같은 Pet예약 프로레스를 진행하면 하나의 Pet에 2명이상의 예약자가 생기는 문제가 있다.
여기서 동시성 문제를 해결하기 위해 관리해야할 임계영역을 Pet 예약 확인
으로 생각했다.
현재 프로잭트의 재화변경의 프로세스를 요약하자면 아래와 같다.
재화 변경이 있는 프로세스는 아래와 같다.
사실 이번 프로잭트에서 재화의 변경은 타인에 의한 동작은 없고 오롯이 자신만이 할 수 있는 동작이다.
때문에 재화 변경에 락(Lock)이 필요하다는 걸 전혀 느끼지 못했다. 하지만 유저가 출금 프로세스를 진행하면서 살짝 늦게 입금 프로세스를 진행한다면 재화가 언제나 +가 된다는 사실을 늦게 알고 재화변경에도 무결성을 반드시 유지해줘야 한다고 느꼈다.
재화 변경 작업에서 무결성을 지키기 위한 임계영역은 현재 유저의 재화 금액 확인으로 생각했다.
문제1과 문제2는 반드시 동시성 문제를 어떻게 해결할 지 생각해본 결과
비관적 락
이 필요하다고 느낌.for update
구문을 통해 베타락
을 걸어 문제1, 문제2의 절대 지켜져야한다고 생각한 임계영역에 접근을 막음.위와 같은 프로세스를 통하여 동시성 문제를 해결하고 데이터의 무결성을 지켰다.
MySQL의 for update
구문은 인덱스 기준으로 레코드에 베타락을 걸기 때문에 먼저 시작한 트랜잭션이 끝나기 전에는 다른 트랜잭션은 레코드에 접근하지 못하니 내가 생각한 임계영역을 지키기에 적합하다고 생각 했다.