[번역] pro*c 데이터베이스 개념(Database Concepts) - 03

Language/Pro*C 2015. 5. 20. 15:40

목 차

▣ 데이터베이스 연결( Connect to the Database )
▣ 연결옵션( Advanced Connection Options )
▣ Definitions of Transactions Terms
▣ How Transactions Guard Your Database
▣ 트렌잭션 시작하고 끝내는 방법(How to Begin and End Transactions)
▣ Commit문의 사용 ( Using the COMMIT Statement )
▣ SAVEPOINT문의 사용 ( Using the SAVEPOINT Statement )
▣ ROLLBACK문의 사용 ( The ROLLBACK Statement )
▣ RELEASE 옵션 ( The RELEASE Option )
▣ SET TRANSACTION문 (The SET TRANSACTION Statement )
▣ Override Default Locking
▣ Fetch Across COMMITs
▣ Distributed Transactions Handling
7) RELEASE옵션(The RELEASE option)
작성한 프로그램이 Commit혹은 Rollback이 작동하지 않을때 비정상적으로 종료되며, Release옵션
을 사용해서 오라클 연결을 끊는다. 아래의 두가지 예를 사용해서 프로그램을 종료한다.
EXEC SQL COMMIT WORK RELEASE;
혹은
EXEC SQL ROLLBACK WORK RELEASE;
8) SET TRANSACTION문 (The SET TRANSACTION Statement )
SET TRANSACTION문은 아래의 예처럼 사용가능한다. SET TRANSACTION문은 Read-only transation에서 처음에 사용되어야만 하며 단지 한번만 사용가능하다. 다른 트랙젝션에는 영향을 미
치지 않는다.
EXEC SQL SET TRANSACTION READ ONLY;
select , commit, rollback문만이가능하다. insert,delete,select for update문이 오면 에러를 발생한다.
아래의 예제는, 가게운용자가 보고서를 출력하기위해서 read-only transaction을 사용해서 과거의 달,주, 일별 판매현황을 체크하는 예제이다. 트랜젝션하는동안 데이터베이스를 update하는 사용자에게는
영향을 주지 않는다.
EXEC SQL SET TRANSACTION READ ONLY;
EXEC SQL SELECT sum(saleamt) INTO :daily FROM sales
WHERE saledate = SYSDATE;
EXEC SQL SELECT sum(saleamt) INTO :weekly FROM sales
WHERE saledate > SYSDATE - 7;
EXEC SQL SELECT sum(saleamt) INTO :monthly FROM sales
WHERE saledate > SYSDATE - 30;
EXEC SQL COMMIT WORK;
/* simply ends the transaction since there are no changes
to make permanent */
/* format and print report */
9) Override Default Locking
오라클은 자동적으로 update 혹은 delete 하는 시점에 Row-level lock을 얻는다. 그래서, update나
delete 전에 row에대한 lock을 원한다면 FOR UPDATE OF 절을 사용해라.
전체 테이블에 대한 lock을 걸기위해서는 LOCK TABLE문을 사용할 수 있다.
Using FOR UPDATE OF
아래의 예와같이 FOR UPDATE OF절을 사용한다.
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename, job, sal FROM emp WHERE deptno = 20
FOR UPDATE OF sal;
FOR UPDATE OF절을 사용하면 여러 테이블을 참조 할 수 없다. 모든행은 FETCH될때 Lock이
걸리는 것이 아니고, OPEN될때 Lock이 걸리게 된다. ROW Lock은 Commit나 RollbacK했을때
해제가되며, commit후에 FOR UPDATE커서로 부터 Fetch 할 수 가 없다.
Using LOCK TABLE
LOCK TABLE문은 지정된 LOCK 모드로 한개이상의 테이블에 Lock을 걸 수 있다.
아래에 예제를 보여주고 있다.
EXEC SQL LOCK TABLE EMP IN ROW SHARE MODE NOWAIT;
10) Fetch Across COMMITs
COMMIT와 FETCH를 혼용하기를 원한다면, CURRENT OF절을 사용해서는 않된다.
ROWID를 사용해서 update난 delete할 현재행을 확인 할 수 있다. 예제는 아래와 같다.
...

EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename, sal, ROWID FROM emp WHERE job = ’CLERK’;
...

EXEC SQL OPEN emp_cursor;
EXEC SQL WHENEVER NOT FOUND GOTO ...

for (;;)
{
EXEC SQL FETCH emp_cursor INTO :emp_name, :salary, :row_id;
...
EXEC SQL UPDATE emp SET sal = :new_salary
WHERE ROWID = :row_id;
EXEC SQL COMMIT;
...
}

11) Distributed Transactions Handling
Distributed Database는 다른 Node의 여러개의 물리적 데이터베이스로 구성된 한개의 논리 데이터
베이스를 말한다. Distributed문은 데이터베이스 링크를 사용한 원격 컴퓨터를 접근 하는 SQL문이다.
Commit이 발생했을때, 원격에 있는 데이터 베이스들이 변경되게 된다. 만약에 ROLLBACK이
발생했을 경우, 모든 변화는 적용되지 않게 된다. 네트웍이나 시스템의 에러로 인해서 문제가 발생
하게되면 FORCE TRANSACTION 시스템 권한을 가진 사람이 수동으로 아래와 같이 적용을 해야한다.
EXEC SQL COMMIT FORCE ’22.31.83’;

EXEC SQL ROLLBACK FORCE ’25.33.86’;
’25.33.86’은 오라클의 데이터 사전 View인 DBA_2PC_PENDING테이블에서 확인 할수 있고 이를
이용하여 수동으로 적용 할 수 있다.



출처 - http://younbok.egloos.com/9342730

: