2014-09-19 2 views
2

PL/SQL 저장 프로 시저 트랜잭션입니까? 트리거, 프로 시저 또는 함수가 실행되면 트랜잭션입니까? 보통 내 절차는 COMMIT으로 끝나고 오류가 발생하면 ROLLBACK을 사용합니다! 잘못 됐나?PL/SQL 저장 프로 시저 트랜잭션입니까?

나는 약 START TRANSACTION 절차에 대해 묻지는 않지만 거래인지 알고 싶습니다.

감사합니다.

+0

질문에 대한 답변이 marke 문제 인 경우 대답 : –

답변

3

Are PL/SQL stored procedures transactions? When a trigger, procedure or function runs, is it a transaction?

번호가 발생하고, A는 COMMIT 또는 ROLLBACK 발생할 때 종료한다. 트랜잭션은 많은 함수 및 프로 시저 호출과 DML 문 및 트리거 코드로 구성 될 수 있습니다. 반면 COMMIT를 많이 발행하여 많은 트랜잭션으로 구성된 프로 시저를 작성할 수 있습니다. 잘못된

I usually end my procedures with COMMIT and when an error occurs I use ROLLBACK! Is it wrong?

강한 단어입니다. 그냥 좋은 연습이 아니라고 말하자. 함수와 프로 시저를 만드는 것은 모듈화에 관한 것입니다. 재사용 가능한 코드를 만드는 것입니다. 함수/프로 시저에 ROLLBACK 또는 COMMIT 문이 포함되어 있으면 호출자의 트랜잭션이 엉망이되어 재사용 할 수 없게됩니다. 따라서 ROLLBACK 또는 COMMIT을 프로 시저에서 사용하지 않고 최상위 호출자에게 맡기는 것이 좋습니다.

코드 전체에서 SAVEPOINTS를 사용하면 단일 함수 나 프로 시저가 트랜잭션의 열린 부분을 남기지 않도록 할 수 있습니다. 그러나 esthetical 이유로 나는 SAVEPOINTS를 사용하지 않는 것을 선호합니다. 내 호출자 함수가 트랜잭션을 올바르게 처리한다는 것을 알고 있기 때문에 필자에게 불필요한 코드가 5 줄 밖에 없다.

예외는 정의가 단일 트랜잭션이므로 COMMIT으로 종료해야하는 자율 프로 시저를 작성할 때입니다.RAISE_APPLICATION_ERROR 또는 레이즈 [예외 이름] 문이 자동으로 하나의 원자 단위로 PL/SQL 블록을 롤백 할 것을

UPDATE

참고. 이것은 커밋되지 않은 변경 사항을 남기지 않으므로 바람직한 효과입니다.

SQL> create table mytable (id int) 
    2/

Table created. 

SQL> create procedure p 
    2 as 
    3 begin 
    4 insert into mytable values (2); 
    5 raise_application_error(-20000,'My exception'); 
    6 end; 
    7/

Procedure created. 

SQL> select * 
    2 from mytable 
    3/

no rows selected 

SQL> insert into mytable values (1) 
    2/

1 row created. 

SQL> exec p 
BEGIN p; END; 

* 
ERROR at line 1: 
ORA-20000: My exception 
ORA-06512: in "X.P", regel 5 
ORA-06512: in regel 1 


SQL> select * 
    2 from mytable 
    3/

     ID 
---------- 
     1 

1 row selected. 
+0

1) 거래가 처음 발생하는 DML로 시작한다고 했으므로 'SELECT'로 시작하고 'COMMIT'으로 끝나는 절차를 작성하면 트랜잭션을 완료 했습니까? 2) 'RAISE APPLICATION ERROR'이후의 'ROLLBACK'은 실현되지 않을까요? – Maghio

+0

2) RAISE 문은 거래를 종료합니다. 그에 따라 게시물을 업데이트했습니다. 감사. –

+0

첫 번째 질문에 대답 할 수 있습니까? – Maghio

0

PL/SQL은 트랜잭션이 아닌 수정입니다. 트랜잭션은 수정 및 읽기 전용 작업의 목록입니다.

pl/sql이 실행되는 경우에도 PL/SQL은 데이터베이스를 변경하지 않습니다.

+0

정확하지 않습니다. 트랜잭션은 읽기 전용 조작도 포함하는 프로세스입니다. – Maghio

0

물론 거래가 아니고 수정 된 것입니다. 그리고 매번 트랜잭션을 저장하기 위해 Commit을 지정하지 않아도됩니다. 예를 들어, 오라클에서 모든 개별 DML 문은 원자 적입니다 (EXCEPTIONS INTO 옵션을 사용하지 않는 한, 전체 성공 또는 첫 번째 실패시 중간 변경을 롤백합니다. 여기서는 다루지 않습니다). 위의 예를 생각해 를 단일 원자 트랜잭션으로 처리 할 문 그룹을하고자하는 경우, 당신은 이런 식으로 뭔가를 할 거라고 :

BEGIN 
    SAVEPOINT start_tran; 
    INSERT INTO .... ; -- first DML 
    UPDATE .... ; -- second DML 
    BEGIN ... END; -- some other work 
    UPDATE .... ; -- final DML 
EXCEPTION 
    WHEN OTHERS THEN 
    ROLLBACK TO start_tran; 
    RAISE; 
END; 

그 방법은, 예외는이 블록에서 문을 발생합니다 롤백되지만이 블록 이전에 실행 된 명령문은 롤백되지 않습니다.

커밋을 포함하지 않음에 유의하십시오. 일반적으로 커밋을 실행하는 호출 프로세스를 선호합니다. 트랜잭션이 제 DML 시작