 |  |
|
난이도 : 초급 Yash Manwani, Associate Software Engineer, IBM Mike Springgay, Senior Development Manager, IBM
원문 게재일 : 2009 년 7 월 30 일 번역 게재일 : 2009 년 9 월 15 일 IBM DB2 9.7 for Linux®, UNIX®, and Windows®의 새로운
기능인 자율 트랜잭션에 대해 설명합니다. 이 기사를 통해 자율 트랜잭션의 정의 및 이를 작성하는
방법에 대한 예제와 전반적인 개요를 이해하실 수 있습니다.
소개
이 기사에서는 DB2 9.7의 새로운 기능인 자율 트랜잭션에 대해 설명한다. 자율
트랜잭션은 데이터베이스 관리자와 애플리케이션 개발자가 관심을 보이고 있는 기능이다.
이 기사에서는 DB2 9.7 for Linux, UNIX, and Windows에 대해 설명하므로 DB2
CLP(Command Line Processor) 및 SQL PL을 알고 있으면 많은 도움이 된다.
예제를 실행하기 위해서는 DB2 9.7 for Linux, UNIX, and Windows 데이터베이스에
액세스할 수 있는 권한이 필요하다. 참고자료에서 DB2 시험판을 다운로드할
수 있다.
트랜잭션에 대한 간단한 설명
트랜잭션은 텍스트, 숫자 또는 두 유형이 혼합된 형식으로 표현할 수 있는 실제
엔터티이며 데이터베이스 관리 시스템에서 처리한다. 트랜잭션은 데이터베이스에 대한 동작으로
인식되며 그룹으로 수행되어야 한다.
사용자 A의 계좌에서 사용자 B의 계좌로 X 용량의 데이터를 전송하는 요청을
수행하는 간단한 트랜잭션을 예로 들어보자. 이 트랜잭션은 Listing 1과 같이 두 개의 SQL 명령문으로
나눌 수 있다.
Listing 1. 간단한 트랜잭션 예제
Update table AccountInfo set CurrentBalance = CurrentBalance - X, where UserName=A
Update table AccountInfo set CurrentBalance = CurrentBalance + X, where UserName=B
|
이 트랜잭션은 두 SQL 명령문이 모두 테이블을 성공적으로 업데이트할 수 있어야만
성공적으로 호출할 수 있다. 두 명령문이 모두 적용되거나 그렇지 않은 경우에는 아무 것도 수행되지
않도록 하기 위해 애플리케이션은 COMMIT가 발생할 때까지 데이터베이스에 변경 사항을 적용하지 않는
방식으로 실행된다. 데이터 무결성을 보증하기 위해 COMMIT가 발생하면 커미트되지 않은 모든 명령문(마지막
COMMIT 이후의 명령문)이 동시에 적용된다. 이 동작은 CLP(Command Line Processor)의 AUTO COMMIT 동작을
해제하고 명령문 세트를 실행한 후 완료되었을 때 COMMIT를 수동으로 실행하는 것과 비슷하다. ROLLBACK은
커미트되지 않은 모든 변경 사항을 제거한다. 따라서 COMMIT 및 ROLLBACK 명령문은 트랜잭션 구현의 중요한
빌딩 블록이다.
자율 트랜잭션 소개
자율 트랜잭션에는 고유한 COMMIT 및 ROLLBACK 범위가 있어 트랜잭션 출력이 호출자의
커미트되지 않은 변경 사항에 영향을 미치지 않는다. 또한 호출하는 세션의
COMMIT와 ROLLBACK은 자율 트랜잭션의 완료 시에 종료된 변경 사항에 영향을 주지 않아야 한다.
호출하는 세션은 호출되는 세션이 컨트롤을 리턴할 때까지 일시 중지된다. 자율 트랜잭션을
지원한다고 해서 병렬 실행 세션을 사용할 수 있는 것은 아니라는 점에 주의해야 한다.
자율 트랜잭션 작성하기
DB2에서 자율 트랜잭션은 자율 프로시저를 통해 구현된다. 저장 프로시저를 사용하면
간편하게 명령문을 블록으로 묶을 수 있다. 자율 프로시저를 작성하려면 Listing 2와 같이 키워드 AUTONOMOUS를
CREATE PROCEDURE 명령문에 지정한다.
Listing 2. CREATE PROCEDURE 명령문 예제
CREATE OR REPLACE your_procedure_name
LANGUAGE SQL
AUTONOMOUS
BEGIN
do autonomous work ;
END
|
자율 프로시저 호출 시 이는 필수적인 트랜잭션 독립성을 보장하기 위해 고유 세션
내에서 실행된다. 자율 프로시저가 성공하면 암묵적으로 커미트가 수행되지만 실패할
경우에는 롤백이 수행된다. 두 경우 모두 호출하는 트랜잭션에 영향을 주지 않는다.
실제 사용 예제
B 은행에서는 중요한 고객 정보가 들어 있는 테이블에 대한 각 쿼리를 올바르게
로깅하려고 한다. 이 목표를 달성할 수 있도록 B 은행의 애플리케이션 개발자에게 중요 데이터에
액세스하는 데 사용할 수 있는 인터페이스 세트가 제공되었다. 각 인터페이스는 저장 프로시저로
구현되었다. 저장 프로시저는 테이블에서 필요한 정보를 리턴하는 동시에 쿼리를 수행한 직원의
사용자 ID와 조회된 고객 레코드의 계좌 번호를 날짜 및 시간과 함께 로깅한다.
가정
SQL은 다음을 전제조건으로 한다.
- 데이터베이스 연결이 존재한다.
- 자동 커미트가 해제되어 있다.
- 명령문 종결 기호가
%로 설정되어 있다. 이 종결
기호는 새 DB2 CLP 세션을 시작할 때 DB2 CLP 명령문 db2 +c -td%를
입력하여 설정할 수 있다.
시작하기
먼저 필요한 테이블을 작성한다. 중요한 고객 정보를 저장할 테이블 하나와 중요
정보에 대한 액세스가 발생할 때마다 로깅할 정보를 저장할 또 다른 테이블이 필요하다. Listing
3에서는 해당 예제를 보여 준다.
Listing 3. 두 예제 테이블 작성하기
DROP TABLE customerSensitiveInfo %
CREATE TABLE customerSensitiveInfo(customerAccountNumber integer, amountOverdue integer) %
DROP TABLE log_table %
CREATE TABLE
log_table(queryingEmployeeID varchar(100),
customerAccNumber integer, when timestamp) %
COMMIT %
|
이제 중요 정보에 대한 액세스가 발생할 때 log_table에 기록할 프로시저를 작성한다(Listing 4 참조).
Listing 4. 로그 테이블에 기록하기
CREATE OR REPLACE PROCEDURE
log_query (in queryingEmployee varchar(100),
in accNumber integer, in when timestamp)
LANGUAGE SQL
BEGIN
insert into log_table values (queryingEmployee, accNumber, when);
END %
COMMIT %
|
B 은행에서 애플리케이션 개발자에게 제공한 인터페이스 중에는 지정된 계좌의
연체 금액을 쿼리하는 데 사용되는 인터페이스가 있다. get_AmountOverdue 프로시저는 먼저 log_query
프로시저를 호출하여 중요 데이터에 액세스할 시간을 기록한다. 그런 다음 customerSensitiveInfo
테이블에서 select 명령문을 실행하여 지정된 계좌 번호의 연체
금액을 검색한다. Listing 5에서는 이에 대한 예제를 보여 준다.
Listing 5. get_AmountOverdue 프로시저
CREATE OR REPLACE PROCEDURE
get_AmountOverdue(in accountNumber integer, out overdue integer)
LANGUAGE SQL
BEGIN
DECLARE due integer;
DECLARE currentTime timestamp;
SET currentTime= CURRENT TIMESTAMP;
CALL log_query(CURRENT USER, accountNumber, currentTime );
SELECT amountOverdue INTO due FROM customerSensitiveInfo
WHERE customerAccountNumber= accountNumber;
SET overdue=due;
END %
COMMIT %
|
get_AmountOverdue 인터페이스를 작성한 후 약간의 고객 데이터를 customerSensitiveInfo
테이블에 추가한다. 그런 다음 Listing 6의 명령문을 실행하여 테이블을 작성한다.
Listing 6. 예제 테이블을 작성하는 명령문
INSERT INTO customerSensitiveInfo VALUES(12345, 10000),(12346,20000) %
COMMIT %
|
결과 테이블에는 표 1과 같은 정보가 들어 있다.
표 1. CustomerSensitiveInfo
| CustomerAccountNumber | AmountOverdue |
|---|
| 12345 | 10,000 | | 12346 | 20,000 |
테이블에 필요한 데이터를 입력했고 테이블에 액세스하기 위한 방법도 파악했으면 다음으로,
계좌 번호 12345의 연체 금액을 검색한다. 여기에서는 데이터를 보기만 하면 되므로 Listing 7과
같이 익명으로 명령문을 실행한 다음 호출 직후에 롤백 명령문을 실행하여 액세스한 흔적을 감춘다.
Listing 7. get_AmountOverdue 코드에 롤백 명령문 추가하기
CALL get_AmountOverdue(12345, ?) %
Value of output parameters
--------------------------
Parameter Name : OVERDUE
Parameter Value : 10,000
return Status = 0
ROLLBACK %
|
log_table의 상태를 보면 Listing 8과 같은 결과를 볼 수 있다.
Listing 8. log_table
SELECT * FROM log_table %
QUERYINGEMPLOYEEID CUSTOMERACCNUMBER WHEN
0 record(s) selected.
|
예상대로 이 로그 테이블은 비어 있는데 이는 테이블에 대한 실제 액세스와 로그 테이블에
삽입하는 두 가지 작업을 모두 포함하는 트랜잭션이 롤백되었기 때문이다. 하지만 이는 이 기사에서 원하는 결과가
아니다. 이제 Listing 9와 같이 AUTONOMOUS 키워드를 log_query 프로시저에 추가한다.
Listing 9. AUTONOMOUS 명령문이 추가된 log_query 프로시저
CREATE OR REPLACE PROCEDURE
log_query (in queryingEmployee varchar(100),
in accNumber integer, in when timestamp)
LANGUAGE SQL
AUTONOMOUS
BEGIN
INSERT INTO log_table values (queryingEmployee, accNumber, when);
END %
COMMIT %
|
이제 Listing 10과 같이 다시 한번 계좌 번호 12345의 연체 금액을 검색한 후
트랜잭션을 롤백한다.
Listing 10. 롤백 명령문이 추가된 get_AmountOverdue 코드
CALL get_AmountOverdue(12345, ?) %
Value of output parameters
--------------------------
Parameter Name : OVERDUE
Parameter Value : 10,000
return Status = 0
ROLLBACK %
|
log_table의 상태를 다시 보면 Listing 11과 같은 결과를 볼 수 있다.
Listing 11. AUTONOMOUS 명령문을 추가한 이후의 log_table
SELECT * FROM log_table %
QUERYINGEMPLOYEEID CUSTOMERACCNUMBER WHEN
98765 12345 2009:05:25:12.00.00.000000
1 record(s) selected.
|
드디어 원하는 결과를 얻게 되었다. 중요 정보를 읽은 트랜잭션 자체가 롤백이더라도
log_table에 대한 항목이 커미트된다. 이 방법을 사용하면 액세스 자체가 커미트되지 않았더라도
데이터에 액세스한 사용자에 대한 히스토리를 관리할 수 있다.
결론
이 기사에서는 자율 트랜잭션에 대한 개념을 살펴보았다. 이제 자율 트랜잭션의
정의뿐만 아니라 DB2에서 이러한 트랜잭션을 작성하는 방법도 잘 알게 되었을 것이다.
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Yash D. Manwani2008년 IBM에 입사한 이후 IBM India에서 Associate Software Engineer로 근무하고 있다. IBM 입사 이후
DB2 ISL 기능 검증 테스트 팀에서 DB2 품질 보증 관련 업무를 맡고 있다. 인도의 Cochin University of Science and Technology에서
전자 및 통신학을 전공했다. |
 | 
|  | Mike Springgay는 DB2 for Linux, UNIX, and Windows 개발 팀 소속의 Senior Development Manager이다. 1997년에
DB2 개발 팀에 합류했으며 현재는 클라이언트-서버 연결 및 저장 프로시저 인프라 분야를 맡고 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|  |