version : 10.1.37-MariaDB
시스템 :
- A 은행으로부터 가상계좌 N개를 발급 받아, 가지고 있음. * 부족할 경우, 추가로 발급.
- 고객이 계좌 인증을 통과할 경우, 등록된 계좌와 가상계좌를 연동.
* 할당할 가상계좌 조회 > 사용자에게 가상계좌 할당 > A은행 링크 요청 > 사용자에게 할당한 가상계좌에 link_id 부여.
* 가상계좌 연동은 어드민 API 서버에서 하고 있음.
문제 :
- A 고객은 회원가입을 통해 계좌 인증을 거쳐 가상계좌를 발급받음.
- B 고객도 같은 시간 어드민에서 계좌 변경을 하여, 가상계좌를 새로 발급 받음.
- A 고객의 가상계좌와 B 고객 가상계좌가 같은 계좌로 DB에 저장됨.
* 실제로 A은행에서 B의 계좌는 링크 실패.
- 송금시 문제 발생
SHOW VARIABLES LIKE '%isolation'; |
처음에는 PHANTOM READ(PHANTOM ROW) 에 의한 문제로 확인했으나, 동시성 문제로 보인다.
1. 서로 다른 서버에서 같은 테이블에 동시에 접근하였다.
- 할당할 가상계좌 조회
● 이때, 서로 같은 계좌를 할당할 계좌로 지정. ( 1234567890)
- 사용자에게 가상계좌 할당
- A에 은행 링크 요청
- 사용자에게 할당한 가상계좌에 link_id 부여.
코드상 별다른 트랜잭션 처리는 되어있지 않으며, 동시에 접근할 경우, 발생할 수 있는 문제이며, 실패할 경우에 대한 처리가 없어, 발생한 문제로 판단.
두 시스템에서 할당할 가상계좌 조회시, 조회 순서를 다르게 하여 처리.
근본적인 해결책은 아니라고 생각된다. 어드민에서 link 실패할 경우에 대한 처리가 필요할 것으로 보인다.
참고 :
https://zzang9ha.tistory.com/381
[MySQL] - 트랜잭션의 격리 수준(Isolation level)
📎 글또 6기 포스팅 1. 미치도록 더웠던 7월의 회고 2. 사용자가 게시물을 작성할 때의 트랜잭션 처리 3. Spring AOP - (1) 프록시 패턴, 데코레이터 패턴 4. [MySQL] - 트랜잭션의 격리 수준(Isolation level) 5
zzang9ha.tistory.com
https://mangkyu.tistory.com/299
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해당
mangkyu.tistory.com
MySQL 트랜잭션 격리수준 확인/변경
본 포스트에서는 MySQL 트랜잭션 격리수준을 확인하는 방법과 변경하는 방법에 대해 정리한다. MySQL 버전에 따른 사용법 차이 예전에는 tx_isolation이 쓰였는데, MySQL 5.7.20에서 transaction_isolation이 alia
luran.me
[mysql] upsert 사용시 주의 (0) | 2023.10.31 |
---|---|
[Mysql] 이모지 삽입 관련 (0) | 2023.08.30 |
[mysql] SELECT command denied to user 'user'@'localhost' for table (0) | 2023.08.21 |
[MYSQL] SELECT 결과 UPDATE 시키기 (0) | 2023.08.10 |
[Cache] 캐싱 전략2 (0) | 2023.05.25 |