#영속성

(on) COMMIT 완료 후에도 트랜잭션이 보장되지 않는 두가지 경우


(1) COMMIT WRITE 기능 사용시
COMMIT WRITE WAITCOMMIT WRITE NOWAIT
{code:noneborderStyle=solid}
(동기/기본값)
- 리두가 모두 디스크에 쓰일 때까지 기다림
{code}
{code:noneborderStyle=solid}
- 안기다림, 디스크에 쓰이기 전에도 다른 세션이 변경된 데이터 볼 수 있음
- 언제써? (실패시 자동으로 재시작할 수 있는 배치(백그라운드) 어플리케이션)
- 맞춤형 데이터 적재 프로그램 - 커밋에 문제가 생길 수 있음을 고려 되어야 함
- 실시간으로 공급되는 데이터를 처리하는 프로그램 - 장애시 생성된 데이터를 무시할 수 있는 경우 (주식시세?)
- 큐잉 메커니즘을 자체적으로 구현한 프로그램 - PROCESSED_FLAG = 'N' → 'Y' → (장애) → 'N' → 'Y'
{code}
borderStyle=none}{code}
h6. (2) 비분산 PL/SQL 코드 블록 내에서 COMMIT 사용시
Demo#1
{code:sqlborderStyle=solid}
-- 클라이언트 애플리케이션에 제어권을 반환하기 전 마지막 한 번만 WAIT 함
SQL> create table t
2 as
3 select *
4 from all_objects
5 where 1 = 0
6 /

Table created.

SQL> create or replace procedure p
2 as
3 begin
4 for x in ( select * from all_objects )
5 loop
6 insert into t values x;
7 commit;
8 end loop;
9 end;
10 /

Procedure created.

-- 위 코드(p) 는 아래와 같다
SQL> create or replace procedure p
2 as
3 begin
4 for x in ( select * from all_objects )
5 loop
6 insert into t values x;
7 commit write NOWAIT;
8 end loop;
9
10 -- make internal call here to ensure
11 -- redo was written by LGWR
12 end;
13 /

Procedure created.

|