을 방지하는 것은 나는 다음과 같은 경우라고 할 수 있습니다.이중 예약
이제 직원이 한 번에 하나의 작업 만 수행 할 수 있으므로 다음 PL/SQL 문을 사용하여 작업을 삽입합니다. 충돌하는 작업이 발견되는 경우, 작업은 (아마 여기에 오류를보고해야하지만,이 간단한 예를 들어 내가 그걸 무시하고있어) 추가되지 않습니다 :
create or replace procedure add_job
(
p_staff_id number,
p_job_name varchar2,
p_start_date date,
p_end_date date
)
as
begin
insert into jobs
(
select p_staff_id, p_job_name, p_start_date, p_end_date from dual
where not exists
(
select 1 from jobs
where staff_id = p_staff_id
and (end_date > p_start_date)
and (start_date < p_end_date)
)
);
end;
문제는 그 나는 두 개의 서로 다른 일자리를 추가하는 경우 두 개의 서로 다른 세션을 한 다음 약속을 두 번 할 수 있습니다. 다음 즉 :
-- Session 1:
add_job(1, 'Help Alice', to_date('2011/08/21 11:00:00', 'YYYY/MM/DD HH24/MI/SS'), to_date('2011/08/21 13:00:00', 'YYYY/MM/DD HH24/MI/SS'));
-- Session 2:
add_job(1, 'Help Bob', to_date('2011/08/21 12:00:00', 'YYYY/MM/DD HH24/MI/SS'), to_date('2011/08/21 14:00:00', 'YYYY/MM/DD HH24/MI/SS'));
-- Session 1:
commit;
-- Session 2:
commit;
위, staff_id
일 12:00 13:00 사이에 예약 더블 될 것입니다. 즉 너무 광범위 잠금입니다 같은 느낌,
lock table jobs in exclusive mode;
을 속임수를 썼는지 :
내 절차의 시작에 추가하는 것으로 보인다. 오라클을 조금 더 세밀하게 처리하도록 강요하는 방법이 있습니까? 가능한 경우 dbms_lock
으로 주위를 돌보지 않을 것입니다. 이 page 힌트 select ... for update
트릭을 할 것이지만, 그것은 세부 사항을주지 않았다.
전체 테이블 잠금 또는 dbms_lock
잠금을 사용하지 않고 이중 예약을 중지 할 수있는 방법이 있습니까? (나는 Oracle 10g를 사용하고 있습니다.)
윌 우 : staff_id는 고유하지 않아야합니다. 한 명의 직원이 여러 작업을 완료 할 수 있습니다. 그것이 바로 요점이며, 직원들의 직업을 나열하고 그 직원에 대한 충돌을 방지합니다. – Clinton
이 답변을 무시하십시오. 각 add_job에 대해 end_date를 지정하지 않아서 발생한 문제입니다. –
당신은 작업 에서 1 선택할 경우 staff_id = p_staff_id 및 ( (종료일> p_start_date 및 시작일 p_end_date) 및 (START_DATE