수강 신청 동시성 제어 처리 0 0 2,138

by gt1000 [SQL Query] 동시성 제어 [2012.06.26 08:51:23]


안녕하십니까?
수강 신청 프로그램을 작성하다 동시 접속자 처리 때문에 질문 올립니다.

대학 수강 신청 프로그램 강좌들이 있고, 학생들은 강좌를 수강 신청 할수 있습니다.
강좌는 선착순으로 지정된 인원만이 수강할수 있습니다.

강좌 테이블
create table lecture (
 lecture_id number  고유키
 lecture_name varchar2 강좌명
 entry_count number  수강인원
)

수강 신청자 테이블
create table lecture_entry (
 entry_id number  고유키
 user_id  varchar2 사용자 아이디
 lecture_id number  강좌 고유키(레프런스키)
)

예를 들어 수학강좌를 20명만 들을수 있다고 한다면

lecture 테이블에 아래와 같은 데이터가 들어가 있으며
lecture_id lecture_name entry_count
1  수학   20

lecture_entry 테이블에 데이터를 입력하는 것이 문제 입니다.
동시 접속자 처리 문제 입니다. 오라클 동시성 제어 관련 검색을 하고 있는데
잘 몰라서 헤매고 있습니다. 수학 과목 수강 신청을 한다면
1 lecture_entry 테이블에 수학 과목 등록 인원을 카운트 함
2 카운트 수가 lecture 테이블의 수학 수강인원 20명 보다 작으면
  lecture_entry 테이블에 insert, 크면 수강 인원 초과 예외 발생

CREATE OR REPLACE FUNCTION lecture_apply
     (v_lecture_id  number,  // 강좌 고유키
      v_user_id  varchar2(30) // 사용자 아이디
      v_entry_count  varchar2(3)) // 수강 인원
RETURN  varchar2
IS
     v_count   number;  // 현재 수강 신청자
     v_result  varchar2(1); // 결과
begin
     v_result = '0';
     select count(*) into v_count
     from lecture_entry
     where lecture_id := v_lecture_id
           for update nowait ;

     IF v_count < v_entry_count THEN
           insert into lecture_entry(entry_id, user_id, lecture_id)
           vales(seq_lecture_entry.nextVal, v_user_id, v_lecture_id);
           v_result = '1'; // 성공 
     ELSE
           v_result = '2'; // 정원초과 
     END IF;
 
      // 예외 발생시 v_result = '3'
 
      commit;
      return v_result;
end;

위와 같이 했을 경우
1 동시 접속자 처리가 잘 되는지가 궁금 합니다.
2 lecture_entry 테이블을 다른 페이지에서 조회, 삭제, 수정 등을 할텐데
  for update 때문에 dead lock 이나 심각한 속도 저하가 있는지 궁금합니다.

염치 없는 부탁이지만 친절한 설명과 조언을 좀 부탁 드리겠습니다.
좋은 하루 되십시요.

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