[DB] [mysql] update 쿼리 (트랜잭션) ab 테스트와 lock wait

SINGING BIRD·2023년 11월 11일

1. 다음과 같은 명령어로 동시에 50개씩 1000개의 요청을 보내보았습니다.

ab -p saveHtmlPayload.json -T 'application/json;
charset=utf-8' -C 'access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZHgiOjg2Nywic2Nob29sX2lkeCI6bnVsbCwiZW1haWwiOiJ6emFuZzUzNUBnbWFpbC5jb20iLCJuYW1lIjoi7Zmp7JykIiwicm9sZSI6MSwidHlwZSI6MywiaWF0IjoxNjk0NDE4MjU0LCJleHAiOjE2OTQ0NDcwNTR9.JAAlTOaYrFL2qGiVq4MYPxg5lj0D3NB45pMrpl3sCX4' -c 50 -n 1000 https://kurumi.mvpick.net/api/project/saveHtml


  • https://kurumi.mvpick.net/api/project/saveHtml api 는 서비스 (꾸럼이) 내의 특정 id 값의 방의 내용을 저장하는 api 입니다.

  • 프로젝트 저장하는 api 엔드포인트에서는 update 구문 하나밖에 없으므로 deadlock 은 발생하기 어려운 상황입니다.

  • 락은 테이블 전체에 걸리는 게 아니라 테이블 내에 작업중인 레코드에만 걸리게 됩니다.

  • 동시에 50개의 api 요청이 들어오는 경우,

    mysql 에서 쿼리 (트랜잭션)을 병렬로 실행시킬 수 있지만,

    update 타켓 (특정 id 값의 방) 이 동일하므로
    update 중인 레코드에 lock 을 걸어서 순차적으로 처리하도록 동작합니다.


2. 트랜잭션 상태를 스크린샷해보았습니다.

  • 동시에 50개씩 요청이 들어오므로 lock wait 가 걸려있는 트랜잭션이 많이 있는 것을 볼 수 있습니다.
  • lock wait 가 많이 걸리지만 순차적으로 처리됩니다.


3. api 엔드포인트 진입접에 queue 를 걸고 activeLimit 를 1 로 설정하여 하나의 api 처리가 끝난 뒤 다음 요청을 처리하도록 세팅해보았습니다.

  • 하나의 트랜잭션이 모두 끝난 뒤 lock 이 풀린 후 그 다음 요청이 실행되므로 lock wait 가 발생하지 않습니다.


profile
good things take time

0개의 댓글