SlideShare a Scribd company logo
PyConKorea2019
Multitasking on DB and Django
Multitasking 환경을 상대하기 위한 DB의
특성과 그런 DB를 상대하기 위한 Django
DB Locktimeout으로 고생하고 있는
peoplefund
RepaymentProcessSystem 개발자
문석환
누구신가요?
seokhwan@peoplefund.co.kr
singletasking인 이런 시절도 있었지만…
MultitaskingSystem
https://oldpc.tistory.com/17
요즘은 이런 작은 제품도 multitasking이 가능한 시스템을
갖고 있음
MultitaskingSystem
https://learn.adafruit.com/introducing-the-raspberry-pi-zero
local시스템에서도 multitasking을 지원하는 요즘, 웹 서비스에서의 multitasking은
필수 구성요소
MultitaskingSystem
여러 process가 공유된 자원에 의존할 경우 race
condition이 발생
RaceCondition
http://extmovie.maxmovie.com/xe/movietalk/30925104
웹 서비스에서 DB가 대표적인 예
• lock timeout이라는 오류를 쉽게 볼 수 있음
RaceCondition
http://extmovie.maxmovie.com/xe/movietalk/30925104
동시다발적인 request가 하나의 공유된 자원인 DB에 접근하게 될 경우 locktimeout이
발생할 수 있음
DebuggingLockTimeout
동시다발적인 request들의 상관관계는 local 디버깅 툴만으로는 확인이 어려움
DebuggingLockTimeout
이론을 바탕으로 한 눈버깅이 필요
DebuggingLockTimeout
https://www.monster.com/career-advice/article/open-source-coding-can-give-your-career-an-edge
눈버깅을 위한 툴
PurposeofThisSession
공유된 자원인 DBMS가 동시다발적인 요청을 안정적으로 처리하기 위해 갖고 있는 특성들
• Django에서 이 특성들을 어떻게 활용할 수 있는가?
PurposeofThisSession
DBMS는 데이터의 일관성을 지키기 위해 transaction과 ACID라는 특성이 존재함
DBandConcurrentProcesses
transaction은 여러 작업(operation)들의 set
• DB operation의 기본 단위
Transaction
READ(balance)
ADD 1000 ON balance
WRITE(balance)
transaction
ACID
https://www.safetysign.com/products/5518/danger-acid-label
ACID - Atomicity
ACID
https://www.safetysign.com/products/5518/danger-acid-label
transaction의 모든 작업들이 모두 반영(commit)되거나 아예
반영되지 않고 원상복구 되는(rollback) 특성
ACID - Atomicity
WRITE(A)
WRITE(B)
transaction
ACID - Consistency
ACID
https://www.safetysign.com/products/5518/danger-acid-label
미리 정의된 규칙에 의해서만 데이터 수정이 가능한 특성
ACID - Consistency
예를 들어 Null 값이 들어갈 수 없는 column에 Null 값을 추가하려 할 경우 DBMS가
에러를 발생
ACID - Consistency
ACID - Isolation
ACID
https://www.safetysign.com/products/5518/danger-acid-label
특정 transaction(T)에서 진행한 작업들이 다른 transaction(Q)에게 보여지는 정도를
나타내는 특성
ACID - Isolation
isolationlevel이 높으면, 하나의 transaction(T)이 변경한 데이터를 (T의 commit이
일어나기 전까지)다른 transaction들은 볼 수 없음
ACID - Isolation
isolationlevel에 대해서는 후반부에 더 자세히 설명
• isolation level은 transaction들 사이의 특성
ACID - Isolation
ACID - Duration
ACID
https://www.safetysign.com/products/5518/danger-acid-label
한번 반영된 transaction은 (시스템이 crash 되어도) 영구히 적용 되어있는 특성
ACID- Duration
DBMSLock
1
https://blognara11.tistory.com/179
multitasking 환경에서 여러 작업들이 동시다발적으로 진행된다고 하지만
ConcurrentTasks
(CPU한 개 기준)한 시간대에는 하나의 작업만이 진행됨
ConcurrentTasks
여러 작업들이 한 줄로 cpu를 사용하기 위해 기다림
ConcurrentTasks
http://nyclovesnyc.blogspot.com/2013/09/iphones-5c5s-launch-draws-record-crowds.html
동시에 같은 계좌에 입출금이 발생하는 경우
ConcurrentTasksandData
ConcurrentTasksWithoutLock
READ(BALANCE)
READ(BALANCE)
입금
WRITE(BALANCE)
WRITE(BALANCE)
1000
1000 + 1000
2000
BALANCE 출금
1000
2000
0
1000
1000 - 1000
0
1000
눈 뜨고 돈이 사라지는 마법을 경험
ConcurrentTasksandData
http://egloos.zum.com/galaon/v/5355771
ConcurrentTaskswithLock
READ(BALANCE)
입금
WRITE(BALANCE)
1000
1000 + 1000
2000
READ(BALANCE)
WRITE(BALANCE)
BALANCE 출금
1000
2000
1000
2000
2000 - 1000
1000
2000
READ(BALANCE)
wait
lock을 이용하면 데이터를 더 안정적으로 다룰 수 있음
ConcurrentTasksandData
DBMS에는 두가지 종류의 lock이 존재
DBMSLockTypes
writelock
• 같은 데이터에 write를 시도하는 다른 transaction을
block
• 같은 데이터에 read를 시도하는 다른 transaction을
block
DBMSLockTypes
https://www.writerswrite.com/writingmemes/
readlock
• 같은 데이터에 write를 시도하는 다른 transaction을
block
• 같은 데이터에 read를 시도하는 다른 transaction을
허용
DBMSLockTypes
https://memeshappen.com/meme/oh-no-meme/what-i-have-to-read-62306
안정적인 데이터의 관리를 위해 DBMS는 lock의 사용법에 대한 protocol도 정의
TwoPhaseLockingProtocol
ExpandingPhase
• lock을 얻을(acquire) 수는 있지만 놓을(release) 수는 없는 상태
TwoPhaseLockingProtocol
ShrinkingPhase
• lock을 놓을(release) 수는 있지만 얻을(acquire) 수는 없는 상태
TwoPhaseLockingProtocol
transaction이 lock을 사용하기 위해서는 두 단계 중 하나에 속해야 함
TwoPhaseLockingProtocol
transaction이 하나의 lock을 놓게 되면 모든 lock들을 놓을
때 까지 새로운 lock을 얻을 수 없음
TwoPhaseLockingProtocol
https://cheezburger.com/9344072192
일반적으로 transaction은 expandingphase로 시작해서 commit/rollback후
shrinkingphase로 돌입해서 lock을 모두 놓게 됨
TwoPhaseLockingProtocol
lock은 조심히 다뤄야 할 대상
DownsideofLock
https://makeameme.org/meme/look-locks-everywhere
lock은 process들이 병렬로 작업하지 못하게 함
DownsideofLock
http://egloos.zum.com/kwangaeto/v/6248656
잘못 사용할 경우 deadlock발생
DownsideofLock
http://mcs109.bu.edu/site/?p=deadlock
IsolationLevels
http://www.ohmynews.com/NWS_Web/view/at_pg.aspx?CNTN_CD=A0001096798
isolationlevel은 lock을 활용해서 transaction간의 상호작용 정도를 조절
IsolationLevels
DBMS에서 발생할 수 있는 3가지 종류의 읽기 현상
ReadPhenomena
DirtyReads
ReadPhenomena
transaction(T)이 다른 transaction(Q)에서 변경한
데이터를 commit하기 전에도 읽을 수 있음
DirtyRead
https://northstateparent.com/2013/01/what-to-do-when-your-child-cheats/
Non-repeatableReads
ReadPhenomena
두 번의 같은 query가 다른 결과값을 반환
• 예: 특정 계좌에 기록된 잔액을 두 번 조회했을 때 서로
다른 잔액이 반환
Non-repeatableRead
https://www.pinterest.co.kr/pin/448741550347685706/
PhantomReads
ReadPhenomena
https://kr.ign.com/metal-gear-solid-5
두 번의 같은 query가 다른 row들을 반환
• 예: 1000원이 남아있는 계좌들의 조회 query를 두 번 실행했을 때 첫번째 계좌
리스트와 두번째 계좌 리스트가 같지 않음
PhantomReads
다른 값을 갖고 있는 같은 row가 반환 VS같은 값을 갖고 있는 다른 row가 반환
Non-repeatable VSPhantomReads
같은 종류의 level이어도 각 DBMS가 구현하는 방식에 따라 약간의 차이점은 존재
IsolationLevels
따라서 Django에서 lock에 대해 이야기할 때 필요한 기본적인 내용만…
IsolationLevels
isolationlevel은 read phenomena를 허용하는 정도
IsolationLevels
IsolationLevels
Reads
Levels
Phantom Reads Non-repeatable Reads Dirty Reads Locks
Serializable NO NO NO READ, WRITE, RANGE
Repeatable Reads YES NO NO READ, WRITE
Read Committed YES YES NO WRITE
Read Uncommitted YES YES YES -
DBandDjango
https://leisun.tistory.com/entry/%EC%95%84%EC%A7%81%EB%8F%84-%EA%B0%80%EC%95%BC-
%ED%95%A0-%EA%B8%B8-M%EC%8A%A4%EC%BA%87-%ED%8E%99
Django는 auto-commit모드가 기본
TransactionandLockinDjango
model object를 생성,삭제,변경하는 statement가 실행될
때 바로 DBquery를 발생시킴
TransactionandLockinDjango
https://www.upi.com/Odd_News/2017/04/03/Hungry-cats-ring-bells-for-treats/6341491227290/
각 statement마다 자동으로 transaction이 씌여짐
TransactionandLockinDjango
https://www.upi.com/Odd_News/2017/04/03/Hungry-cats-ring-bells-for-treats/6341491227290/
Django는 기본적으로 transaction을 시작하는 api를 제공하지 않음
TransactioninDjango
django.db.transaction.atomic을 사용하여 여러 statementset에 대해서
atomicity를 보장할 수 있음
TransactioninDjango
TransactioninDjango
NestedAtomicFunction
NestedAtomicFunction
바깥쪽 transaction 시작
만약 안쪽 transaction이 실패하면 save point까지 rollback
바깥쪽 transaction이 종료되면 지금까지 작업한
전체 작업들이 commit
안쪽 transaction을 시작하기 전에 save point 생성
Django는 서버에 설정된 DBMS의 isolationlevel을 사용함
IsolationLevelsinDjango
Django에서 OPTIONS를 사용하면 서버 설정을 overwrite할 수 있음
• 1.11부터 OPTIONS에 isolation_level이라는 설정값 이름을 제공
IsolationLevelsinDjango
MySQL의 default는 RepeatableReads
• Django는 Read Committed를 권장
IsolationLevelsinDjango
주의:MySQL에서 isolationlevel은 binarylog(slave DB를
만들기 위한 log)와 밀접한 연관이 있음
BewareI
https://www.memedroid.com/memes/detail/93889
Django와 MySQL의 isolation level을 다르게 설정할
경우 lock이 생각과 다르게 동작할 수 있음
BewareI
https://www.memedroid.com/memes/detail/93889
isolationlevel의 설정에 의해 각 statement들은 자동으로 read/writelock이 사용됨
LockinDjango
임의로 lock을 발생시켜야 할 경우 transaction.atomic 이후 select_for_update
함수를 사용할 수 있음
LockinDjango
주의:select_for_update를 select_related와 함께
사용할 경우 join걸린 모든 row에 lock이 발생
BewareII
https://www.ytn.co.kr/_ln/0109_201512051510331549
주의:연관된 모델들의 경우 lock의 순서를 정해야 deadlock을 회피할 수 있음
BewareIII
예: lock이 필요할 경우 무조건 T1 - T2 - T3 순서로
lock을 얻기
BewareIII
주의:너무 많은 데이터가 한번에 만들어 질 경우 auto
increment에 의해 프로세스가 lock을 기다리는 현상이
발생할 수 있음
• 참조: InnoDB의 AUTO_INCREMENT
BewareIV
https://www.reddit.com/r/funny/comments/60dpn7/beware_of_cat/
atomic과 select_for_update를 사용하면 Django에서도 임의로 racecondition을
컨트롤 할 수 있음
Usage
단 너무 많이 사용할 경우 실제 서비스에서는 locktimeout을 쉽게 만나볼 수 있음
Usage
locktimeout을 피하기 위해서는 process들이 lock을 들고
있는 시간을 최소화 해야 함
Usage
http://www.womennews.co.kr/news/articleView.html?idxno=58436
주의:lock은 가장 바깥쪽 transaction이 끝나야 release됨
BewareV
https://imgflip.com/i/1gfgj6
Usage
Usage
critical section
lock 시간 개선
QA
http://www.lolcats.com/popular/12279-dude-wait-what.html

More Related Content

Similar to Multitasking on DB and Django

분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
MongoDB
 
Accelerate spring boot application with apache ignite
Accelerate spring boot application with apache igniteAccelerate spring boot application with apache ignite
Accelerate spring boot application with apache ignite
YEON BOK LEE
 
지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기
Ted Won
 
[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock
Seok-joon Yun
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Amazon Web Services Korea
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
중선 곽
 
AWS 9월 웨비나 | Amazon Aurora Deep Dive
AWS 9월 웨비나 | Amazon Aurora Deep DiveAWS 9월 웨비나 | Amazon Aurora Deep Dive
AWS 9월 웨비나 | Amazon Aurora Deep Dive
Amazon Web Services Korea
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
uEngine Solutions
 
Let's Play with Data Safely
Let's Play with Data SafelyLet's Play with Data Safely
Let's Play with Data Safely
Dataya Nolja
 
데이터야 안전하게 놀아보자.V.1
데이터야 안전하게 놀아보자.V.1데이터야 안전하게 놀아보자.V.1
데이터야 안전하게 놀아보자.V.1
Dongchan Sung
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver진상 문
 
7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기
GeniusYG
 
03 realm 쓰기 & 질의
03   realm 쓰기 & 질의03   realm 쓰기 & 질의
03 realm 쓰기 & 질의
Lee-Jong-Chan
 
Mcollective orchestration tool 소개
Mcollective orchestration tool 소개Mcollective orchestration tool 소개
Mcollective orchestration tool 소개
태준 문
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
흥배 최
 
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
Osc Osc
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
John Kim
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
YoungSu Son
 
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
DK Lee
 

Similar to Multitasking on DB and Django (20)

분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
 
Accelerate spring boot application with apache ignite
Accelerate spring boot application with apache igniteAccelerate spring boot application with apache ignite
Accelerate spring boot application with apache ignite
 
지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기
 
[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
AWS 9월 웨비나 | Amazon Aurora Deep Dive
AWS 9월 웨비나 | Amazon Aurora Deep DiveAWS 9월 웨비나 | Amazon Aurora Deep Dive
AWS 9월 웨비나 | Amazon Aurora Deep Dive
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
Let's Play with Data Safely
Let's Play with Data SafelyLet's Play with Data Safely
Let's Play with Data Safely
 
데이터야 안전하게 놀아보자.V.1
데이터야 안전하게 놀아보자.V.1데이터야 안전하게 놀아보자.V.1
데이터야 안전하게 놀아보자.V.1
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver
 
7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기
 
03 realm 쓰기 & 질의
03   realm 쓰기 & 질의03   realm 쓰기 & 질의
03 realm 쓰기 & 질의
 
Mcollective orchestration tool 소개
Mcollective orchestration tool 소개Mcollective orchestration tool 소개
Mcollective orchestration tool 소개
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
 

Multitasking on DB and Django