경합 처리 로직 질문 0 1 1,133

by 김성호 [SQL Query] [2014.10.11 21:41:30]


팬션 객실이 20평 10개, 30평 10개가 있습니다.

예약은 1인이 객실 2개까지 예약할 수 있습니다. (동일 평수 중)

예약은 3주전 예약가능, 매일 오전 9:00 정각에 site가 open 되며,  선착순 예약입니다.

 

테이블은 객실마스타, 객실예약 으로 설계 하였습니다. (간편축소)

 

객실준비 (t_master)

m_date varchar2(8)                영업일자

m_type char(1)                       객실type  (1=20평, 2=30평)

m_roomno varchar2(4)           객실번호

m_bkid varchar2(20)              예약자회원번호

m_bkname varchar2(20)        예약자명

 

객실예약 (t_booking)

t_date varchar2(8)            예약일자

t_type char(1)                   객실type

t_bkcnt number(1),           예약객실수

t_bkid varchar2(20)          예약자id

t_bkname varchar2(20)    예약자명

 

고객이 객실 예약을 하면 t_booking 테이블에 예약일자, 객실타입, 객실수를 insert를 합니다.

이때 09:00정각 예약site에 동시 로그인 회원이 500여명 가까이 경합이 되며,

예약은 몇초만에 끝이 납니다.

t_booking table에 insert하기전 잔여 객실수를 쿼리하여 예약테이블에 insert하는데도

잔여객실보다 많이 insert가 됩니다.

insert 쿼리문장 >>

select count(*)   into :cnt from t_master where m_date = :p_date and m_bkid is null;

If cnt > 10 Then

   messagebox('알림','예약이 완료되었습니다.!')

Else

  insert into t_booking (:p_date, :p_bkcnt, :p_bkid, :p_bkname);

End if;

 

초과 예약을 방지하려면 어떤 로직을 추가 해야 될까요?

몇일 이것때문에 머리를 쥐어 뜯고 있습니다.  ㅠ.ㅠ

도와주세요...  plz ^^

 

by 비주류 [2014.10.13 09:53:48]

객실예약 테이블을 중복 예약 안되도록 업무 및 설계 변경하시거나 (pk 객실번호+일자 등...)

해당 일자의 잔여객실 테이블을 별도로 만들고 select for update 로 잡아서 먼저 들어온 예약 작업이 완료될때까지 대기하도록 하는정도로 가능할 것 같습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입