예시로 가정해볼게
room 테이블, member 테이블, reservation 테이블이 있음.
회원이 방을 예약하면 reservation에 room id와 member id,
그리고 순번인 no가 저장되게 할거임.
no 칼럼은 같은 room에 대해 순서대로 증가함.
room1에 회원 두명이 차례로 예약하면 각각 no로 1, 2를 받는식.
room2는 room2 대로 고유한 시퀀스를 가지고.
이렇게 같은 room_id에 대해서는 중복된 no가 없도록 하고 싶음.
이런 경우 어떤 식으로 락을 걸어야될까..
room 테이블, member 테이블, reservation 테이블이 있음.
회원이 방을 예약하면 reservation에 room id와 member id,
그리고 순번인 no가 저장되게 할거임.
no 칼럼은 같은 room에 대해 순서대로 증가함.
room1에 회원 두명이 차례로 예약하면 각각 no로 1, 2를 받는식.
room2는 room2 대로 고유한 시퀀스를 가지고.
이렇게 같은 room_id에 대해서는 중복된 no가 없도록 하고 싶음.
이런 경우 어떤 식으로 락을 걸어야될까..
딱 답을 내주지 않아도 참고할만한 힌트도 좋음 그리고 reserv 테이블은 수정은 일어나지 않지만 삽입과 조회는 빈번히 발생한다는 가정. 이왕이면 신규삽입은 조금 느리더라도 조회는 빨랐으면 좋겠음.
레디스 써라
예시를 간략화해서 그런데 RDBMS 선에서 해결해야되는 문제임..ㅜ
room1 에 회원 5명 예약 no = [1, 2, 3, 4, 5]
room2에 회원 3명 예약 no = [1, 2, 3] 이게 맞음?
room1에 회원1이 예약ㅡno 1할당 room1에 회원2가 예약ㅡno 2 할당 room2에 회원2가 예약ㅡno 1 할당 이런 식 ㅇㅇ
테이블의 특정 칼럼 값마다 자동증가 줄 수는 없으려나
room에 next reserve seq 컬럼 만들거나 별도 next seq 테이블 만들면 안되려나
next seq 읽어와서 1증가시키고 insert 하는 식으로
나도 최후의 수단으로 별도 next seq 테이블 생각중이긴해. room 마다 seq 넣고 신규 예약 시 비관락 걸고 수정하면 될테니.. 근데 다른 깔쌈한 방법 있나 해서ㅜ
아니 그냥 reservation 테이블에서 seq순으로 역순 정렬해서 레코드 한개만 select for update로 읽어온 다음에 seq + 1로 insert해도 될거같은데
room에 컬럼만드는건 보류인게, next seq 컬럼의 값을 둘이서 참조하면 안되니까 예약이 만들어질때마다 조회ㅡ쓰기를 막아야되는데 그러면 단순히 room의 정보만을 조회할때도 동시성이 떨어질테니까ㅜ
그방법이 최선인가ㅜ 암튼 고마워 형 검토해볼게
형 근데 궁금한게 있는데 만약 형말대로 트랜잭션1이 시퀀스값 젤 높은 애를 select for update 걸면 그 트랜잭션2는 그 레코드에 대해 기다려야하잖아? 근데 트랜잭션1이 삽입에 성공하면 트랜잭션2는 기존에 기다리던 레코드가 아니라 트랜잭션1이 신규로 삽입한 레코드에 select for update를 걸어야 하잖아? 자동으로 대상이 바뀌나..?
트잭1이 삽입하고 나면 새로 삽입된 값이 가장 높은 시퀀스값이니까... 아 어렵네
보셈
https://gall.dcinside.com/m/backend/3280
예약할 때마다 no가 증가하는 방식이면 처음에 room_id 컬럼이랑 각 방마다 지금까지의 예약 숫자를 저장하는 reserv_no 컬럼을 두는 room_reserv 테이블을 만들면 될듯(reserv_no의 초기값은 0) 이러면 방에 예약 하나 들어올 때마다 테이블에 room_id로 예약번호 가져오고 기존에 있던 room_id의 reserv_no 1 증가 시키는 update 쿼리 날려서 갱신하면 될 거임 락 문제는 나도 잘 모르겠는데 찾아보니까 뭔가 있긴 한듯
맞음 ㅇㅇ
맞음ㅇㅇ 그게 위에 next seq 테이블 만든다는 방식. 예약 생성 시 next seq 테이블에 레코드 단위로 select for update tx 락 걸면 내가 바라는 결과가 나오긴 함. 최후의 보루로 두고 있는 설계이기도 하고.