yoond
34
2020-08-07 16:20:57
3
186

Mysql 사용시 트랜잭션으로 카운팅시 동시성문제 해결관련 질문입니다.


안녕하세요. 그동안 트랜잭션 개념을 잘못알고 있었던것같습니다.

트랜잭션 시작후 트랜잭션 종료 전까지 쿼리를 사용하면 쿼리에 사용된 컬럼들을 자동으로 lock시켜서 동시성문제를 해결하는 것으로 이해하고 있었고 예외를 통한 롤백외에는 처리하지 않았었는데요.


1. 이번에 선착순으로 20명만 허락하는 신청기능을 하는 서버앱을 DB와 연동해서 테스트해보니 위 방법을 통해서아래와 같은 로직으로 테스트 해보니 20명만 신청되지 않고 초과했습니다.

- 트랜잭션 시작 -> 카운트 값을 읽어서 20명 초과하는지 확인후 초과하면 무시, 초과하지 않으면 값+1 -> 커밋 -> 트랜잭션 종료


2. 그래서 아래와 같이 바꾸고 테스트를 해보니 제대로 작동하더군요.

- 트랜잭션 시작 -> 카운트 값+1 -> 카운트 값을 읽어서 20명 초과하는지 확인후 초과하면 롤백, 초과하지않으면 커밋 -> 트랜잭션 종료


보니까 커넥션별로 트랜잭션이 시작되면 트랜잭션이 시작된 상태에서 로직을 스스로 수행하고 문제가 있으면 롤백, 아니면 커밋해서 값 업데이트를 하는 것 같은데요.

이와 같이 값이 증가하는데 조건분기가 들어가는 트랜잭션 로직을 제작할때 주로 2.와 같은 방법으로 하는것이 맞는지 궁금합니다. 

참고로 개발언어는 Node.js, DB는 Mysql 사용하고 있습니다

0
  • 답변 3

  • spoon
    1k
    2020-08-07 16:30:01
  • 레버리지
    2k
    2020-08-07 16:45:57
    흠 대량의 사용자가 몰리면 지연시간이 발생할수 있겠네요
  • 캐티
    225
    2020-08-07 22:48:13

    참고된 개발언어의 노드js에 따르면 노드모듈 mysql 드라이버의 트렌젝션은 비동기성을 따르기 때문에 트랜젝션 시작후로 릴리즈단계까지 세션을 바꾸지 않도록 하여야합니다.
    여럿 쿼리를 섞어버리는 경우에 커넥션 풀링과 로드벨런싱 효과 때문에 1번세션에서 2번세션에서 3번세션에서 이렇게 번갈아가면서 쿼리를 하여 결국 말씀하신 것 처럼 틀어집니다.

    pool.getConnection 통한 직접 로직 제어를 해주어야해요.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.