woowacourse-study / 2022-Real-MySQL

⚡️토르⚡️의 짜릿한 Real MySQL 뽀개기 🔨
9 stars 3 forks source link

SKIP LOCKED과 동시 처리 #33

Open hyeonic opened 2 years ago

hyeonic commented 2 years ago

주제

SKIP LOKED와 동시 처리

선정 이유

우리는 다양한 프로젝트에서 겪는 문제의 원인을 정확히 파악하기 위해서는 DB 설정에 대한 특성을 적절히 알아야 한다. 동시 처리를 진행할 때 SKIP LOCKED을 사용할 때와 안할 때의 차이를 이해하기 위해 선정했다.

해당 텍스트

SKIP LOCKED 옵션은 SELECT하려는 레코드가 다른 트랜잭션에 의해 이미 잠겨진 상태라면 에러를 반환하지 않고 잠긴 레코드는 무시하고 잠금이 걸리지 않은 레코드만 가져온다.

mysql> BEGIN;
mysql> SELECT * FROM salaries WHERE emp_no = 10001 FOR UPDATE SKIP LOCKED;

... 애플리케이션 연산 수행...

mysql> UPDATE salaries SET ... WHERE emp_no = 10001 AND from_date = '1986-06-26';
mysql> COMMIT;

동시에 많은 사람들이 접근하는 쿠폰 발급 기능을 구현한다고 가정한다. 쿠폰 발급을 위해서는 발급 여부를 위해 UPDATE를 진행할 것이며 관련해서 트랜잭션을 잠그게 될 것이다. 아래는 SKIP LOCKED를 사용하지 않은 경우와 사용한 경우의 스루풋을 비교한 것이다.

SKIP LOCKED 미 사용 시 동시 처리 성능

트랜잭션 -1: ---------->
트랜잭션 -2: - -  a  - - > ---------->
트랜잭션 -3: - -  a  - - >  - -  a  - - > ----------> 
트랜잭션 -4: - -  a  - - >  - -  a  - - >  - -  a  - - > ----------> 

a로 표시된 선의 길이는 하나의 트랜잭션이 처리되는 데 걸리는 시간을 의미한다.

SKIP LOCKED 사용 시 동시 처리 성능

트랜잭션 -1: ---------->
트랜잭션 -2: -b- > ---------->
트랜잭션 -3: -b- > -b- > ----------> 
트랜잭션 -4: -b- > -b- > -b- > ----------> 

b로 표시된 선의 길이는 잠겨진 레코드 1건을 스킵하는 데 걸리는 시간을 의미한다.

정리

FOR UPDATE SKIP LOCKED는 MySQL 서버로 동시에 유입된 트랜잭션들이 대기 시간 없이 잠긴 레코드를 스킵 하고 사용 가능한 레코드를 찾기만 하면 즉시 트랜잭션 처리를 시작할 수 있다. SKIP LOCKED를 작성하지 않을 경우 잠긴 트랜잭션이 완료되어야 비로소 두 번째 트랜잭션이 시작될 수 있다.

많은 프로젝트에서 자신의 애플리케이션이 겪는 문제의 원인을 제대로 분석하지 못하고 애플리케이션 코드는 놔둔 채 MySQL 서버가 느려 트랜잭션이 느려진다고 판단한다. 서비스 처리 지연이 발생하면 병목 지점을 정확히 확인하고 원인을 분석한 뒤 해결책을 찾는 것이 좋다.

관련 페이지

142p ~ 147p

HJ-Rich commented 2 years ago

멋지네요... ✨