기능 / 절차에서 DML 작업 후 커밋이 필요합니까?


20

함수 / 프로 시저에서 삽입 / 삭제 / 업데이트 후 커밋을 작성해야하는지 궁금하십니까?

예:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

또는 절차

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

삭제 후 커밋해야합니까?

다음 상황을 이해할 수 없습니다 :

  1. SQL 창에서 함수 / 프로 시저를 호출하면 커밋이 필요합니다.

    그러나

  2. dbms_scheduler를 사용하여 함수 / 프로 시저를 예약하고 작업을 실행하면 delete 문이 자동으로 커밋됩니다.

    왜?

답변:


24

일반적으로 절차는 커밋해서는 안됩니다. 이러한 종류의 트랜잭션 제어 결정은 논리적 트랜잭션이 실제로 완료된 시점을 알고있는 상위 수준의 코드로 남겨 져야합니다. 스토어드 프로 시저 내부에서 커미트하는 경우 프로 시저가 더 큰 트랜잭션의 일부가되도록 변경을 원하는 호출자는 단순히 프로 시저를 직접 호출 할 수 없으므로 재사용 성을 제한합니다.

대화식으로 프로 시저를 호출하는 경우 Oracle은 프로 시저 호출을 논리적 트랜잭션으로 만들 것인지 또는 여러 프로 시저 호출을 포함하는 더 큰 트랜잭션을 작성할지 여부를 모르기 때문에 트랜잭션을 명시 적으로 커밋 또는 롤백해야합니다. 당신이 사용하는 경우 dbms_scheduler, dbms_scheduler작업이 논리적 거래이며이 성공적으로 가정 작업의 끝 (에 투입한다고 가정 dbms_job같은 일을).

함수는 처음부터 데이터를 조작해서는 안됩니다. 데이터를 조작하는 함수는 SQL 문에서 호출 할 수 없습니다 (함수 자체는 거의 적절하지 않은 자율적 트랜잭션을 사용하도록 선언 된 경우). 함수와 프로 시저를 둘 다 갖는 요점은 함수가 SQL 문에 임베드 될 수 있으며 데이터를 변경하지 않기 때문에 사용자에게보다 자유롭게 부여 될 수 있다는 것입니다.


1
Oracle에서 호출자가 프로 시저 호출을 바인드하는 트랜잭션을 시작할 수 없습니까? SQL Server에서는 프로 시저 내부에서 커밋 할 수 있지만 호출자가 해당 프로 시저를 호출하기 전에 트랜잭션을 열면 호출자가 커밋 할 때까지 아무것도 커밋되지 않습니다.
Nick Chammas

4
@NickChammas-오라클은 중첩 트랜잭션 개념이 없습니다. 프로 시저가 커밋하면 호출자가 그 시점까지 수행 한 모든 것이 커밋됩니다. 호출자는 항상 첫 번째 명령문 (프로 시저 호출이든 다른 것이 든)으로 암시 적으로 트랜잭션을 시작하므로 트랜잭션을 종료하려면 항상 호출자에게 달려 있어야합니다.
저스틴 동굴

@JustinCave 사실이지만 자율 거래를 잊지 마십시오.
Philᵀᴹ

@Phil-맞습니다. 그러나 그것은 매우 다른 동물입니다. 자율적 트랜잭션은 호출자가 수행 한 커밋되지 않은 변경 사항을 볼 수없고 호출자가 롤백 할 수 없으므로 로깅 절차 이외의 다른 부분이 자율적 트랜잭션을 사용하도록 선언 될 가능성은 거의 없습니다.
저스틴 동굴

4

귀하의 질문에 대답하기 위해; 왜?

게시물이 2 세이기 때문에 아마 지금까지 이미 알고있을 것입니다. 그러나 나는 기록을 위해 응답 할 것입니다.

# 1에 커밋이 필요하고 # 2에 필요하지 않은 이유는 Oracle의 기본 데이터베이스 설정이 세션이 끝날 때 트랜잭션을 커밋하기 때문입니다. sqlplus에 있고 코드를 수동으로 실행하면 트랜잭션이 즉시 커밋되지 않습니다. 명시 적 커밋을 실행하거나 sqlpus에서 로그 오프하면 트랜잭션이 커밋됩니다.

# 2에서 자동 커밋을받는 이유는 스크립트를 실행할 세션을 생성하기 때문입니다. 완료되면 자동으로 로그 오프되어 자동 커밋이 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.