Django 트랜젝션으로 동시성 처리
조건에 맞는 경우만 처리
Check - then - Act 패턴
if 조건: 처리
잔고가 100원 이상이면 출금
여기서, 조건 확인과 처리는 반드시 하나의 트랜젝션으로 동작해야 한다.
위험! 만약 그렇지 않으면,
Read - (gap) - Write
요청과 처리 사이(gap)에 다른 요청이 들어오는 경우.
요청1: 잔고가 100원 이상인가? YES
요청2: 잔고가 100원 이상인가? YES
처리1: 출금 100원, 잔고 0원
처리2: 출금 100원, 잔고 -100원?
Django에서는 transaction.atomic 을 사용하여 트랜젝션을 임의로 설정한다.
with transaction.atomic():
if 조건검사():
처리()
그리고 select_for_update 를 사용하여 LOCK을 걸어
다른 요청은 대시킨다.
qs = WorkTime.objects.select_for_update().filter(조건들)
list(qs) # DB hit를 위해서
이렇게 하면 조건들에 해당하는 row들(qs)에만 LOCK이 걸린다.
트랜젝션이 끝날때 까지.
참고, 읽기만 하는건 LOCK과 무관
MVCC; Multi-Version Concurrency Control