[번역] pro*c 데이터베이스 개념(Database Concepts) - 02
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
▣ 연결옵션( 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
3) Definitions of Transactions Terms
Transactions이란 주제를 이해하기위해서는 몇가지 용어의 개념을 알고 넘어가야 한다.
오라클은 동시성(concurrency)을 제어 해야만 하는데 이를 제어하지 못한다면, 데이터이 손실이 발생
할 수도 있기때문이다.
데이터를 동시에 접근하는것을 제어하기위해서 Locks를 사용한다. Lock은 사용자에게 임시적으로
데이터 베이스 리소스에 임시적으로 권한을 부여한다. 그래서, 데이터는 사용자가 작업을 끝낼때가지
변경될수 없도록 한다.
같은 데이터베이스 객체에 둘 이상의 사용자가 접근할때 Deadlock이 발생할 수 있다.
한사용자가 테이블을 쿼리하고 다른 사용자가 동시에 테이터를 update했을때 쿼리에의해 읽힌 데이터
는 변경되지 않는다. 오라클은 테이블 데이터의 스넵샷(snapshot)을 만들고, 레코드는 rollback segment에서 변경된다.
4) How Transactions Guard Your Database
트렌젝션 중간에 프로그램이 실패하면, 데이터 베이스는 자동적으로 이전상태로 복원하게된다.
다음장에서는 트랜젝션을 정의 하고 제어하는 방법에 대해서 배울것이다.
5) Transactions을 시작하고 끝내는 방법
트렌잭션은 처음 sql문이 실행되면 시작되고 다음 SQL문이 실행되면 다른 트랜잭션이 자동적으로
실행된다. 그래서 모든 실행가능한 문장은 트랜젝션의 부분이된다.
트랜젝션을 끝내는 방법은 아래와 같다.
● COMMIT 혹은 ROLL BACK문을 실행한 경우
● ALTER,CREATE,GRANT와 같은 DDL문을 실행한경우
소프트웨어적인 문제나 하드웨어적인 문제와같은 기대하지 않은 문제가 발생한 경우 트랜젝션이
끝나며 오라클은 트랜젝션을 ROLL BACK 시킨다.
5) Commit문의 사용 ( Using the COMMIT Statement )
COMMIT명령은
COMMIT명령은
● 트랜젝션동안에 변경된 내용을 영원히 바꾼다.
● 다른 사용자에게 변경된 내용을 볼 수 있도록 한다.
● 테이블이나 행에 걸려있는 모든 LOCK를 해제한다.
● CURRENT OF절이 참조하고있는 커서를 닫는다.
● 트랜젝션을 끝낸다.
EXEC SQL COMMIT WORK RELEASE;
위의 문장은 트랜젝션을 COMMIT하고 오라클 연결을 끊는다. WORK는 ANSI호환성을 제공하고,
RELEASE 옵션은 프로그램이 잡고있는 모든 오라클 리소스를 해제하고, 데이터 베이스를 로그오프
한다. DDL명령은 COMMIT을 할 필요가 없다. 이문장들은 자동으로 COMMIT을 실행한다.
6) SAVEPOINT문의 사용 ( Using the SAVEPOINT Statement )
Savepoints는 긴 트랜젝션을 나눌수 있도록 해준다. 아래의 예제는 MAIL_LIST 테이블에 접근하여
for (;;)
{
printf("Customer number? ");
gets(temp);
cust_number = atoi(temp);
printf("Customer name? ");
gets(cust_name);
EXEC SQL INSERT INTO mail_list (custno, cname, stat)
VALUES (:cust_number, :cust_name, ’ACTIVE’);
...
}
for (;;)
{
printf("Customer number? ");
gets(temp);
cust_number = atoi(temp);
printf("New status? ");
gets(new_status);
EXEC SQL UPDATE mail_list
SET stat = :new_status
WHERE custno = :cust_number;
}
/* mark savepoint */
The ROLLBACK Statement
3-20 Pro*C/C++ Precompiler Programmer’s Guide
EXEC SQL SAVEPOINT start_delete;
EXEC SQL DELETE FROM mail_list
WHERE stat = ’INACTIVE’;
if (sqlca.sqlerrd[2] < 25) /* check number of rows deleted */
printf("Number of rows deleted is %dn", sqlca.sqlerrd[2]);
else
{
printf("Undoing deletion of %d rowsn", sqlca.sqlerrd[2]);
EXEC SQL WHENEVER SQLERROR GOTO sql_error;
EXEC SQL ROLLBACK TO SAVEPOINT start_delete;
}
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL COMMIT WORK RELEASE;
exit(0);
sql_error:
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
printf("Processing errorn");
exit(1);
하나의 savepoint로 rollback을 하면 그후에 지정된 savepoint는 삭제된다, 그러나 rollback이
트랜젝션의 현재 지점을 표시하는데 SAVEPOINT는 사용된다. 예를 들어, 아래의 문장은
start_delete라는 이름으로 SAVEPOINT를 지정한것이다. :
start_delete라는 이름으로 SAVEPOINT를 지정한것이다. :
EXEC SQL SAVEPOINT start_delete;
Savepoints는 긴 트랜젝션을 나눌수 있도록 해준다. 아래의 예제는 MAIL_LIST 테이블에 접근하여
새로운 리스트를 추가하고, 예전의 리스트를 UPDATE 하거나, 삭제하는 예제이다. 삭제후에 sqlerrd의
3번째 요소를 체크해서 그수가 기대치보다 크다면 savepoint인 start_delete까지 rollback을 처리해서 삭제 되지 않도록 처리하는 예제이다....
for (;;)
{
printf("Customer number? ");
gets(temp);
cust_number = atoi(temp);
printf("Customer name? ");
gets(cust_name);
EXEC SQL INSERT INTO mail_list (custno, cname, stat)
VALUES (:cust_number, :cust_name, ’ACTIVE’);
...
}
for (;;)
{
printf("Customer number? ");
gets(temp);
cust_number = atoi(temp);
printf("New status? ");
gets(new_status);
EXEC SQL UPDATE mail_list
SET stat = :new_status
WHERE custno = :cust_number;
}
/* mark savepoint */
The ROLLBACK Statement
3-20 Pro*C/C++ Precompiler Programmer’s Guide
EXEC SQL SAVEPOINT start_delete;
EXEC SQL DELETE FROM mail_list
WHERE stat = ’INACTIVE’;
if (sqlca.sqlerrd[2] < 25) /* check number of rows deleted */
printf("Number of rows deleted is %dn", sqlca.sqlerrd[2]);
else
{
printf("Undoing deletion of %d rowsn", sqlca.sqlerrd[2]);
EXEC SQL WHENEVER SQLERROR GOTO sql_error;
EXEC SQL ROLLBACK TO SAVEPOINT start_delete;
}
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL COMMIT WORK RELEASE;
exit(0);
sql_error:
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
printf("Processing errorn");
exit(1);
하나의 savepoint로 rollback을 하면 그후에 지정된 savepoint는 삭제된다, 그러나 rollback이
일어난 지점의 savepoint는 삭제되지 않으며, 같은 이름의 savepoint가 있다면, 먼저 지정한 것은
지워진다. COMMIT 혹은 ROLLBACK 문은 모든 savepoint를 지운다.
7) Rollback문의 사용 ( Using the ROLLBACK Statement )
Rollback문은 데이터베이스의 변경된 내용을 되돌리려고 할때 사용한다.
Rollback이 일어나면 아래와 같은 일이 발생하게 된다.
● 현재 트랜젝션이 일어난 동아 발생한 데이터베이스의 변경을 되돌린다.
● 모든 savepoint를 삭제한다.
● 트랜젝션을 끝낸다.
● parse lock을 제외하고 모든 행과 테이블에 걸린 lock을 해제한다.
● CURRENT OF 절에서 참조된 모든 커서를 닫는다.
출처 - http://younbok.egloos.com/9342731
'Language > Pro*C' 카테고리의 다른 글
[번역] 데이터유형과 호스트변수( Datatypes and Host Variables ) - 01 (0) | 2015.05.20 |
---|---|
[번역] pro*c 데이터베이스 개념(Database Concepts) - 03 (0) | 2015.05.20 |
[번역] pro*c 데이터베이스 개념(Database Concepts) - 01 (0) | 2015.05.20 |
[소스] PRO*C의 기본구조와 Indicator의 사용예 (0) | 2015.05.20 |
Pro*C 가이드/사이트 (0) | 2015.05.20 |