Oracle에서는 특정 프로 시저의 사본 하나만 실행되도록해야합니다. 이미 실행 중이고 사용자가 다른 것을 열려고하면 오류가 발생합니다.
가장 좋은 방법은 무엇입니까?
답변
DBMS_LOCK
독점 잠금 으로이 작업을 수행 할 수 있습니다 .
다음 절차를 참조하십시오.
CREATE OR REPLACE PROCEDURE myproc
IS
lockhandle VARCHAR2(128);
retcode NUMBER;
BEGIN
DBMS_LOCK.ALLOCATE_UNIQUE('myproclock',lockhandle);
retcode:=DBMS_LOCK.REQUEST(lockhandle,timeout=>0, lockmode=>DBMS_LOCK.x_mode);
IF retcode<>0
THEN
raise_application_error(-20000,'myproc is already running');
END IF;
/* sleep so that we can test with a 2nd execution */
DBMS_LOCK.sleep(1000);
retcode:=DBMS_LOCK.RELEASE(lockhandle);
END myproc;
/
테스트 (세션 1) :
SQL> BEGIN
2 myproc();
3 END;
4 /
(반환하면 분명히 반환 DBMS_LOCK.sleep()
).
테스트 (세션 2) :
SQL> BEGIN
2 myproc();
3 END;
4 /
BEGIN
*
ERROR at line 1:
ORA-20000: myproc is already running
ORA-06512: at "PHIL.MYPROC", line 12
ORA-06512: at line 2
SQL>
분명히 당신은해야합니다 GRANT EXECUTE ON DBMS_LOCK TO YOURUSER;
.
답변
‘잠금’테이블을 사용하십시오.
프로 시저가 시작될 때 테이블에 알려진 값이 있는지 점검하십시오. 존재하는 경우 더 이상 진행하지 않고 proc을 종료하십시오. 없으면 테이블에 값을 쓰고 프로 시저를 실행 한 다음 값을 삭제하고 정상적으로 종료하십시오.
답변
고객에게 이와 같은 고유 한 비즈니스 로직이있는 요청이 있으면 질문을 돌리고 왜 이것이 필요한지 묻습니다.
하나의 사본 만 실행되도록하는 가장 좋은 방법은 사용자가 절차에서 전혀 실행하지 못하게하는 것입니다. 이 절차가 매우 특별한 경우에는 사용을 dba / developers로 제한해야합니다.
다른 방법은이 절차를 작업으로 만 실행하는 것입니다. 이를 호출하는 작업이 실행 중인지 확인하려면 프로 시저에 점검을 추가하십시오. 그런 다음 추가 처리를 중지하고 발생을 기록하십시오.