CI 묻고 답하기

제목 mysql 트랜젝션 질문입니다.
카테고리 기타 솔루션
글쓴이 akdsakk 작성시각 2017/08/08 21:27:55
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 14308   RSS

예를 하나 들어보겠습니다.

1000원을 소유하고 있는 유저가 있고 이 유저가 500원짜리 과자라는 아이템을 구매할때 과정입니다.

 

1. 유저 보유 돈을 조회한다.(SELECT쿼리) 

2. 유저가 보유한 돈이 과자를 사야하는 500원 보다 클 경우 조건 통과

3. 보유 금액 차감 관련(UPDATE쿼리)

4. 구매내역을 관리하는 테이블에 (INSERT쿼리)

3,4 번내용은 트랜젝션이 걸려있다고 가정하겠습니다.

 

이때 만약 MASTER DB(INSERT,UPDATE..)를 하는 DB가 한대이고 그 아래 여러개의 SLAVE DB가 있다고 할때 만약 한번에 동일 유저가 1~4번까지 과정을 한번에 만번 정도 동시에 요청을  때린다고 했을때 MASTER DB에 트랜젝션은 과도하게 몰려 있어 처리되는 시간이 오래 걸리니 슬레이브 쪽에서 그냥 보유금액이 갱신이 안되어 통과되버리는 문제가 발생할수도잇을 것같은데요.  이럴 때는 어떻게 해결해야하나요?

 다음글 보안때문에 질문드립니다~ 폼태그 관련 (2)
 이전글 쿼리 결과를 못가져오는데 도와주세요 (8)

댓글

/ 2017/08/09 14:01:36 / 추천 2
select for update라고 락거는 방법이 있습니다.
akdsakk / 2017/08/09 15:07:20 / 추천 0
좋은 정보 감사합니다. 물리적으로 한 장비에 대해서만 동작하게되겠네요. 여러 대의 장비를 사용할경우에는 어떻게해야할지 고민해봐야겠습니다.
변종원(웅파) / 2017/08/09 20:41:59 / 추천 0

말씀하신 상황은 정상 상황이 아닌데 정상적으로 처리하려는 이유가 있을까요?

락 걸고 처리되지 않게 막아야하는게 정상인데요?

다중 유저가 1-4번 프로세스를 동시에 실행하는거면 모를까요. ^^

akdsakk / 2017/08/09 22:31:37 / 추천 0

네 일반적인 클라이언트는 하지 않는 행동이지만 어뷰징을 위해 생각해봤습니다.

저희 회사에 DB 구조를 기준으로  마스터 장비가 한대이다보니 위와 같은 경우가 생길수있다고 생각이 들어서 다른분들의 의견을 듣고싶었습니다. 많은 이벤트 페이지에서도 위와 같은 증상이 발견되는 글도 많이 보았찌만 명쾌한 해답을 제시하는 곳이 없어 궁금하네요

kaido / 2017/08/10 09:03:15 / 추천 1

기술 문제보다 이런 개념으로 생각 하시면 좋을것 같습니다.

 

문제가 생기지 않는 것이 가장 좋은 일이다.

다만 언제든 문제는 생길수 있고 그 문제를 해결 할 수 있는것이 중요하다.

 

즉 트러블은 생길수 있고, 그 트러블을 복원 시킬수 있게 주기적인 백업과 추적이 가능하게 로그를 남기는게 중요하다는 이야기입니다.

100% 완벽한 시스템을 구축 할 수는 없습니다.

 

최근 유머 코드로 이런 문제 이야기하면 이렇게 대답 합니다. 그럼 아마존 AWS 써. 그럼 돼. ㅎㅎ

akdsakk / 2017/08/15 16:50:47 / 추천 0
여러가지 좋은 정보 감사합니다.
변종원(웅파) / 2017/08/15 19:39:50 / 추천 0

비정상적 요청이 특정 횟수 이상 들어오면 막아야죠.

말씀하신 대로 어뷰징을 막는 기본 로직입니다. 예전 오버추어 광고의 경우 특정 아이피에서 특정 시간동안 특정 횟수이상 요청이 들어오면 막아버렸습니다.