Oracle은 오류 발생 시 트랜잭션을 롤백합니까?
바보 같은 질문이지만 트랜잭션 관리에 대한 Oracle 개념 가이드에는 다음과 같은 내용이 나와 있습니다.
트랜잭션은 다음 중 하나가 발생하면 종료됩니다.
사용자는 SAVEPOINT 절 없이 COMIT 또는 ROBALL 문을 발행합니다.
사용자는 CREATE, DROP, RENE 또는 ALTER와 같은 DDL 문을 실행합니다.현재 트랜잭션에 DML 문이 포함된 경우 Oracle은 먼저 트랜잭션을 커밋한 다음 DDL 문을 실행하고 새 단일 문 트랜잭션으로 커밋합니다.
사용자가 Oracle과 연결을 끊습니다.현재 트랜잭션이 커밋되었습니다.
사용자 프로세스가 비정상적으로 종료됩니다.현재 트랜잭션이 롤백됩니다.
마지막 사항을 오류가 있는 쿼리를 발행하면 거래가 롤백된다는 의미로 해석하면 됩니까?
이것은 흥미로운 질문입니다!
Oracle에서 오류가 발생하면 트랜잭션이 아닌 현재 문을 롤백합니다.문은 최상위 명령어로 SQL 문(INSERT, UPDATE...) 또는 PL/SQL 블록일 수 있습니다.
즉, 문(예: java에서 호출된 pl/sql 프로시저)이 오류를 반환하면 Oracle은 트랜잭션을 호출 전과 동일한 논리 상태로 전환합니다.이것은 매우 도움이 됩니다. 반 실행 절차에 대해 걱정할 필요가 없습니다(**).
AskTom의 이 스레드는 다음과 같은 주제를 다룹니다.
[문] 완전히 발생하거나 완전히 발생하지 않으며 데이터베이스가 작동하는 방식은 다음과 같은 논리적 등가물을 수행하는 것입니다.
begin
savepoint foo;
<<your statement>>
exception
when others then rollback to foo;
RAISE;
end;
이 기능은 다른 언어보다 pl/sql로 데이터베이스 코드(*)를 작성하는 것이 훨씬 쉬운 이유라고 생각합니다.
(*) Oracle DB와 상호 작용하는 코드는 물론, 다른 DBMS의 기본 절차 언어도 유사한 기능을 가지고 있다고 생각합니다.
(**) DDL은 Oracle에서 트랜잭션이 아니므로 DML에 대해서만 해당됩니다.또한 데이터 사전을 업데이트하는 일부 DBMS 패키지(예:DBMS_STATS
), 종종 DDL과 같은 변경을 수행하고 커밋을 발행합니다.의심스러운 경우에는 설명서를 참조하십시오.
업데이트: 이 동작은 PL/SQL에서 가장 중요한 개념 중 하나이며, PL/SQL 문의 원자성을 보여주는 작은 예를 제시하겠습니다.
SQL> CREATE TABLE T (a NUMBER);
Table created
SQL> CREATE OR REPLACE PROCEDURE p1 AS
2 BEGIN
3 -- this statement is successful
4 INSERT INTO t VALUES (2);
5 -- this statement will raise an error
6 raise_application_error(-20001, 'foo');
7 END p1;
8 /
Procedure created
SQL> INSERT INTO t VALUES (1);
1 row inserted
SQL> EXEC p1;
begin p1; end;
ORA-20001: foo
ORA-06512: at "VNZ.P1", line 5
ORA-06512: at line 2
SQL> SELECT * FROM t;
A
----------
1
오라클은 p1을 호출하기 직전 시점까지 트랜잭션을 롤백했습니다.일의 반이 없습니다.마치 프로시저 p1이 호출된 적이 없는 것 같습니다.
여기서 "사용자 프로세스"는 Oracle에 대한 연결을 생성하는 클라이언트 시스템에서 실행되는 프로세스를 의미합니다.A즉, A우(SQL*Plus
할 경우는 , TADO ) 는 OracleSQL*Plus
TOD 프로세스가 트랜잭션 중에 해당 사용자 프로세스가 종료되면 해당 트랜잭션이 롤백됩니다.이는 PMON이 클라이언트가 사망했다는 것을 알게 되면 바로 실행됩니다. 이는 시간이 조금 걸릴 수도 있기 때문에 Oracle이 사용자 프로세스의 실패와 현재 명령을 실행하지 않는 사용자 프로세스를 구분하는 것이 항상 사소한 일은 아닙니다.
저스틴의 의견에 동의합니다. 그의 통찰력은 정확합니다.추가 정보 추가:애플리케이션 개발자로서 오류가 발생할 경우 롤백 명령을 명시적으로 호출해야 합니다.즉, 적절히 문을 트랜잭션 블록으로 그룹화하는 것도 고려해야 합니다.트랜잭션 블록과 롤백은 기술에 따라 다르게 처리되므로 이를 잘 이해할 수 있도록 연구할 필요가 있습니다.
언급URL : https://stackoverflow.com/questions/1468116/does-oracle-roll-back-the-transaction-on-an-error
'programing' 카테고리의 다른 글
JSF, 구성 요소를 주기적으로 ajax로 새로 고침? (0) | 2023.10.01 |
---|---|
(현) 리터럴의 범위 (0) | 2023.10.01 |
시스템의 대안.웹.보안.회원가입.aspnetcore에서 암호 생성(netcore app1.0) (0) | 2023.10.01 |
잘못된 사용 부작용 연산자 함수 내에 삽입 (0) | 2023.10.01 |
-> C 구조체의 형식 인수가 잘못되었습니다. (0) | 2023.10.01 |