안녕하십니까?
수강 신청 프로그램을 작성하다 동시 접속자 처리 때문에 질문 올립니다.
대학 수강 신청 프로그램 강좌들이 있고, 학생들은 강좌를 수강 신청 할수 있습니다.
강좌는 선착순으로 지정된 인원만이 수강할수 있습니다.
강좌 테이블
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 이나 심각한 속도 저하가 있는지 궁금합니다.
염치 없는 부탁이지만 친절한 설명과 조언을 좀 부탁 드리겠습니다.
좋은 하루 되십시요. |