PL/SQL 저장 프로 시저 트랜잭션입니까? 트리거, 프로 시저 또는 함수가 실행되면 트랜잭션입니까? 보통 내 절차는 COMMIT
으로 끝나고 오류가 발생하면 ROLLBACK
을 사용합니다! 잘못 됐나?PL/SQL 저장 프로 시저 트랜잭션입니까?
나는 약 START TRANSACTION
절차에 대해 묻지는 않지만 거래인지 알고 싶습니다.
감사합니다.
PL/SQL 저장 프로 시저 트랜잭션입니까? 트리거, 프로 시저 또는 함수가 실행되면 트랜잭션입니까? 보통 내 절차는 COMMIT
으로 끝나고 오류가 발생하면 ROLLBACK
을 사용합니다! 잘못 됐나?PL/SQL 저장 프로 시저 트랜잭션입니까?
나는 약 START TRANSACTION
절차에 대해 묻지는 않지만 거래인지 알고 싶습니다.
감사합니다.
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.
PL/SQL은 트랜잭션이 아닌 수정입니다. 트랜잭션은 수정 및 읽기 전용 작업의 목록입니다.
pl/sql이 실행되는 경우에도 PL/SQL은 데이터베이스를 변경하지 않습니다.
정확하지 않습니다. 트랜잭션은 읽기 전용 조작도 포함하는 프로세스입니다. – Maghio
물론 거래가 아니고 수정 된 것입니다. 그리고 매번 트랜잭션을 저장하기 위해 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 시작
질문에 대한 답변이 marke 문제 인 경우 대답 : –