본문 바로가기
Etc

Pk키 Max+1 동시성이슈

by 당리 2024. 6. 9.

현재 운영하고있는 서비스의 테이블중에

특정컬럼조합으로 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