기타 개념/Oracle

오라클 - 프로시저의 COMMIT

워제하 2024. 9. 6. 10:27

 

프로시저에 BEGIN 이 여러가 있을 때 COMMIT이 붙어있는 곳도 있고 없는 곳도 있는 이유??

 

=>
- `COMMIT`이 있는 블록은 해당 작업을 즉시 반영하는 중간 저장 역할을 함.
- `COMMIT`이 없는 블록은 전체 작업이 완료될 때까지 기다리며, 트랜잭션의 일관성을 유지하기 위해 사용
- 트랜잭션 제어와 비즈니스 로직의 요구사항에 따라 각 `BEGIN` 블록에서 `COMMIT`을 사용할지 말지가 결정됨

 

 

 


1. 트랜잭션 (Transaction)
트랜잭션은 하나의 작업 단위로, 논리적으로 연관된 작업을 묶어서 실행하는 것.

트랜잭션은 ACID(Atomicity, Consistency, Isolation, Durability) 속성을 따라야 하며, 데이터베이스 작업이 부분적으로 실행되거나 데이터가 불완전한 상태로 남아서는 안됨.

- COMMIT : 트랜잭션을 완료하고 데이터베이스에 모든 변경 사항을 영구적으로 적용.
- ROLLBACK : 트랜잭션을 취소하고 데이터베이스를 이전 상태로 되돌림.

 

 


2. BEGIN 블록과 트랜잭션 제어
여러 `BEGIN` 블록이 있을 때, 각 블록이 트랜잭션의 일부일 수 있지만, 그 블록이 독립적인 트랜잭션인지, 단일 트랜잭션 내의 부분인지에 따라 `COMMIT`을 해야 할지 여부가 결정됨.

 

 


3. COMMIT이 있는 블록과 없는 블록의 차이
- COMMIT이 있는 블록 :
  - 이 블록에서 이루어진 작업은 데이터베이스에 즉시 반영됨. 이후 트랜잭션이 성공적으로 완료되면, 이 변경 사항은 되돌릴 수 없음.
  - 보통 중요한 데이터 변경 작업이나 특정 단계에서 중간 저장이 필요한 경우 `COMMIT`을 사용.
  - 예를 들어, 고객 데이터는 반드시 저장되어야 하며, 그 이후 다른 작업에서 문제가 생기더라도 이 데이터는 남아 있어야 하는 경우 `COMMIT`을 할 수 있음.

- COMMIT이 없는 블록 :
  - 이 블록의 작업은 아직 트랜잭션이 완료되지 않은 상태로 이후 다른 작업이 모두 성공해야 트랜잭션이 최종적으로 커밋됨.
  - 만약 이 블록 이후에 오류가 발생하거나 ROLLBACK이 호출되면, 해당 트랜잭션 내의 모든 변경 사항은 취소됨.
  - 예를 들어, 여러 작업이 논리적으로 하나의 작업 단위로 묶여야 하는 경우, 모든 작업이 성공적으로 완료될 때까지 COMMIT을 미루고, 트랜잭션 전체가 성공했을 때 한꺼번에 COMMIT 할 수 있음.

 

 

 

4. 왜 `COMMIT`을 블록별로 다르게 하는가?

- 부분적인 작업 보존 : 일부 작업은 실패하더라도 반드시 데이터베이스에 저장되어야 하는 경우가 있다. 예를 들어, 로그 기록이나 주요 데이터를 저장하는 작업은 실패하더라도 그 기록을 남겨야 하므로 중간에 `COMMIT`을 사용해 변경 사항을 반영할 수 있음.

- 전체 작업의 일관성 유지 : 일부 `BEGIN` 블록에서는 다른 트랜잭션이 아직 완료되지 않았기 때문에, 일관성을 위해 마지막에 한꺼번에 `COMMIT`하는 것이 필요함. 예를 들어, 여러 테이블에 데이터가 연관되어 있을 때, 모든 테이블에 데이터가 정상적으로 입력되었을 때만 `COMMIT`을 수행하는 경우.

 

 

 

 

예시 ) 

``` PL / SQL

BEGIN
  -- 첫 번째 BEGIN 블록 (로그 기록이나 부분 작업)
  INSERT INTO log_table (log_message) VALUES ('작업 시작');
  COMMIT;  -- 중간 커밋 (로그는 남겨야 하므로 바로 커밋)

  -- 두 번째 BEGIN 블록 (주요 작업)
  BEGIN
    INSERT INTO main_table (data) VALUES ('중요한 데이터');
    -- 여기서는 COMMIT을 하지 않음, 나중에 모든 작업이 완료되면 커밋
  END;

  -- 세 번째 BEGIN 블록 (또 다른 작업)
  BEGIN
    UPDATE another_table SET column = '수정 데이터';
    -- 여기서도 COMMIT을 하지 않음
  END;

  -- 전체 작업이 성공적으로 완료되면 한 번에 COMMIT
  COMMIT;  
EXCEPTION
  WHEN OTHERS THEN
    -- 에러 발생 시 전체 트랜잭션을 롤백
    ROLLBACK;
END;
```

'기타 개념 > Oracle' 카테고리의 다른 글

<if test = ‘’>  (0) 2024.12.19
Choose, when, otherwise  (0) 2024.12.16
Union, Union All  (2) 2024.09.26
테이블 권환 확인  (0) 2024.09.19
오라클 - 프로시저, 커서  (0) 2024.09.06