현재 운영하고있는 서비스의 테이블중에
특정컬럼조합으로 Max+1로 쌓이는 pk키가 있다.
재수없으면 발생했던 동시성이슈... ( 재수없으면 키듑이 발생중)
이번에 개선을 해보고자 다른 pk전략을 검색해봤다.
1. 시퀀스사용
가장 빠르게 해결 할 수 있는게, 시퀀스를 사용해서 동시성이슈를 해결하는거다.
단점은 기존에는 아래형식으로 특정컬럼의 값이 변경되면 다시 1부터 쌓아주고있는데
A A 1
A A 2
A A 3
A A 4
B B 1
B B 2
B B 3
시퀀스로 쌓아주면 아래와같이 계속 +1이 돼서, 개발자 입장에서 보기가 너무 지저분하다.
A A 1
A A 2
A A 3
A A 4
B B 5
B B 6
B B 7
단점은 보기가 지저분하다 1개이다
서비스에서 해당 컬럼으로 처리해주는 로직은 따로없고,
동시성이슈 확실히 해결할거같다.
우선 이 방법으로 수정을 하는게 가장 베스트 인거같다.
2. 오라클 락킹전략
SELECT NVL(MAX(seq_number), 0)
FROM my_table
WHERE category_id = #{categoryId} AND subcategory_id = #{subcategoryId}
FOR UPDATE
SELECT ~FOR UPDATE
테이블의 락을 거는 전략이다.
근데 운영하고있는서비스에 데드락이 걸리는 최악의 상황이 있을거같아서, 무서워서 이방법은 제외했다.
리스크는 피하는게 답
3. 채번테이블 생성
채번을 위한 테이블을 만들어서 키관리를 하는방식인데,
지금 동시성이슈가 발생한 테이블의 구조와 잘 맞지 않고,
사실 채번테이블을 만든다고해서 동시성이슈가 해결이 될까 라는 의구심이 들어서
생각만 해보고있다.ㅋ
'Etc' 카테고리의 다른 글
MySQL - 언어설정 (0) | 2024.06.16 |
---|---|
FCM - CCS Invalid JSON 발생하는 이유 (0) | 2024.06.09 |
ChatGPT 4.o가 알려주는 Java (0) | 2024.06.02 |
웹에서 스마트폰 단말기모델 확인 (1) | 2024.05.26 |
Design Pattern - 종류 (0) | 2024.05.19 |