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



이 블로그의 인기 게시물

MSSQL SP에서 외부 DLL 사용하는 방법 (CLR 확장저장프로시저)

반올림 올림 내림 버림(절사) 차이와 구현방법

럭스 원종희 인터뷰 (펌)