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