티스토리 뷰

카테고리 없음

[ETC] 중복되지 않은 시퀀스 번호는 SELECT Query만 있어서 되지 않는다.

주인장 진빼이

이전 시간에 중복되지 않은 시퀀스 SQL에 대해 정리해보았다.

중복되지 않은 시퀀스 Query만 사용한다고 해서 완벽하게 고유하지않은 주문번호를 처리할 수 있는 것은 아니었다.

 

만약 주문이 발생하고, 누군가 동시에 select했을 때 좋지 않은 결과가 나타난다.

20211020 + 0001을 2번 할당받을 수 있는 경우가 발생하는 것이다.

 

ai, pk를 사용하여 주문 정보가 누가 먼저 create 되냐에 따라 갈릴 수 있지만...

주문 정보를 auto_incmrent, pk를 사용하는 경우는

현재 나의 웹사이트에서 주문이 몇번일어났는지 사용자가 쉽게 알 수 있기 때문에 지양하는 편이다.

 

auto_increment가 적용된 컬럼 대신에

쿼리 테이블을 이용하면 절대로 중복되지 않은 주문번호를 할당받을 수 있다.

 

단계는 아래와 같다.

0. create table (주문번호 할당 테이블 생성)

1. lock table (write) 

2. key insert

3. unlock table

 

첫번째 테이블 쓰기를 잠근다.

이로써 해당 테이블은 locking 되었으므로, 다른 커넥션에서 접근하려면 기다려야 한다.

 

두번째 주문번호 할당 테이블에다가 키(고유한 주문번호)를 삽입한다.

 

세번째 locking된 테이블을 해제한다.

 

만약 동시 사용자가 접근하더라도 테이블이 잠겨있으므로

그 순간에는 주문번호를 삽입할 수가 없다.

이로써 대기상태가 된다 자칫하면 데드락(무한로딩)이 걸릴 수 있으니 이점 유의하자.

 

테이블은 반드시 풀어주고,

while로 특정 조건에 대한 반복을 돌리는 경우도 주의하여 코드를 작성해야 한다.

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함