BEGIN - PL/SQL에서 Atomic 트랜잭션을 종료합니다.
이 정보는 찾기 쉬울 텐데, 저는 운이 없었어요.
내가 가지고 있을 때BEGIN - END
PL/SQL의 블록은 원자성 트랜잭션으로 동작하며, 이 트랜잭션은 히트 시 커밋을 시도합니다.END
차단하고 문제가 생기면 변경 사항을 롤백할 수 있습니까?
그렇지 않은 경우 BEGIN - END 블록 내의 코드가 아토믹 트랜잭션처럼 동작하도록 하려면 어떻게 해야 하며 블록은 어떻게 "기본값"으로 동작합니까?
EDIT: 스토어드 프로시저에서 실행 중이며 암묵적인 블록을 사용하고 있습니다.
일단은BEGIN..END
통사적 요소일 뿐 트랜잭션과는 무관합니다.
둘째, Oracle에서는 모든 개별 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;
이렇게 하면 예외로 인해 이 블록의 문이 롤백되지만 이 블록 이전에 실행된 문은 롤백되지 않습니다.
COMMIT는 포함하지 않습니다.통상, COMMIT를 발행하는 경우는 호출 프로세스를 선호합니다.
BEGIN이..예외 핸들러가 없는 END 블록은 다음과 같이 자동으로 처리됩니다.
BEGIN
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
END;
예외가 발생하면 모든 삽입 및 업데이트가 롤백되지만 예외 핸들러를 추가하는 즉시 롤백되지 않습니다.그래서 저는 세이브 포인트를 사용한 명시적인 방법을 선호합니다.
BEGIN
-END
블록은 PL/SQL의 구성 블록이며 각 PL/SQL 단위는 이러한 블록 하나 이상에 포함됩니다.네스트BEGIN
-END
일반적으로 PL/SQL 블록 내의 블록은 특정 예외를 트랩하고 해당 특수 예외를 처리한 후 관련 없는 예외를 발생시키기 위해 수행됩니다.단, PL/SQL에서는 항상 트랜잭션에 대한 커밋 또는 롤백을 발행해야 합니다.
트랜잭션을 포함하는 PL/SQL 내에 원자성 트랜잭션을 포함하려면PRAGMA AUTONOMOUS_TRANSACTION
디폴트 블록에 격납부탁드립니다.이를 통해 해당 블록 내의 모든 DML을 포함하는 트랜잭션과 독립적으로 커밋하거나 롤백할 수 있습니다.
그러나 네스트된 블록에 대해서는 이 플러그마를 선언할 수 없습니다.이것은 다음에 대해서만 선언할 수 있습니다.
- 최상위(네스트되지 않음) 익명 PL/SQL 블록
- 목록 항목
- 로컬, 스탠드아론, 패키지 기능 및 절차
- SQL 개체 유형의 메서드
- 데이터베이스 트리거
레퍼런스:오라클
이것이 익명 PL/SQL 블록인지 선언적 블록인지에 대해서는 언급하지 않았습니다.패키지, 절차 또는 기능.단, PL/SQL에서는 트랜잭션을 데이터베이스에 저장하기 위해 COMMIT를 명시적으로 수행해야 합니다.COMMIT는 실제로 저장되지 않은 모든 트랜잭션을 현재 사용자의 세션에서 데이터베이스에 저장합니다.
오류가 발생하면 트랜잭션은 암묵적으로 롤백을 수행합니다.
이것은 PL/SQL의 기본 동작입니다.
Commit PL/SQL 블록의 기본 동작:
모든 트랜잭션을 명시적으로 커밋하거나 롤백해야 합니다.PL/SQL 프로그램에서 커밋을 발행할지 클라이언트 프로그램에서 롤백을 발행할지 여부는 애플리케이션 로직에 따라 달라집니다.트랜잭션을 명시적으로 커밋하거나 롤백하지 않으면 클라이언트 환경에 따라 트랜잭션의 최종 상태가 결정됩니다.
예를 들어 SQLPlus 환경에서 PL/SQL 블록에 COMMIT 또는 ROLLBACK 문이 포함되지 않은 경우 트랜잭션의 최종 상태는 블록을 실행한 후 수행하는 작업에 따라 달라집니다. 데이터 정의, 데이터 제어 또는 COMMIT 문을 실행하거나 EXIT, DISCONNECT 또는 KIT 명령을 실행하면 오라클이 트랜잭션을 커밋합니다. ROLLBLUS 문을 실행하거나 SQLPlus 세션을 중단하면 Oracle이 트랜잭션을 롤백합니다.
https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/sqloperations.htm#i7105
언급URL : https://stackoverflow.com/questions/11966020/begin-end-block-atomic-transactions-in-pl-sql
'programing' 카테고리의 다른 글
인증 유형 10이 지원되지 않아 Postgres DB에 연결할 수 없습니다. (0) | 2023.02.28 |
---|---|
하이버네이트를 사용한 Spring Boot에서의 데이터베이스 이행 처리 방법 (0) | 2023.02.28 |
AngularJS $location이 경로를 변경하지 않음 (0) | 2023.02.28 |
예상되는 할당 또는 함수 호출: no-used-expressions ReactJS (0) | 2023.02.28 |
Wordpress에서 SQL 주입을 방지하는 방법 (0) | 2023.02.28 |