database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Tutorials 4967 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 4967
자습서 - 3. 고급 기능 - 3.4 트랜잭션
작성자
김상기(ioseph)
작성일
2003-09-23 03:47
조회수
7,107

원문: http://database.sarang.net/database/postgres/manual/manual-7.3/tutorial-transactions.html

옮긴이: 김상기

3.4. 트랜잭션

트랜잭션 이란 모든 데이터베이스 시스템에서 기본적인 한 개념입니다. 트랜잭션의 핵심은 여러개의 작업이 최종적으로는 하나로 취급된다는 것입니다. 이것을 전부 적용 아니면 전부 취소 작업(all-or-nothing operation)이라고 부릅니다. 각각의 트랜잭션은 독립적이여서 동시에 발생한 트랜잭션에 대해서는 그 트랜잭션 안에서의 데이터만 적용됩니다. 또, 하나의 트랜잭션 안에서 어떤 작업 도중 오류가 발생 되었다면, 이전에 적용되었던 모든 작업들에 대해서는 모두 취소됩니다.

 

예를 들어서, 간단한 은행 데이터베이스를 생각해봅시다. 이 은행 데이터베이스에는 각 계좌의 현 잔액을 보관하는 accounts 테이블과, 각 계좌의 거래내역을 보관하는 branches 테이블로  구성되어있습니다. 이때, Alice 계좌에서 $100.00 빼서 Bob 계좌로 이체하려고 합니다. 이것을 구현한다면, 가장 간단하게 아래와 같이 처리하면 되겠지요.

UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
    WHERE name = 
        (SELECT branch_name FROM accounts WHERE name = 'Alice');
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
    WHERE name = 
        (SELECT branch_name FROM accounts WHERE name = 'Bob');

물론 계좌 이체가 이렇게 간단하게 움직여지지는 않겠지만, 여기서 중요한 것은 계좌 이체 작업을 하려면, 적어도 네 개의 독립된 update 구문으로 작업해야한다는 것입니다. 이런 작업을 하는데, 만일 위의 네 개의 작업 도중 부분적으로 작업을 성공하고, 그 나머지는 실패한다면, 각 계좌에 남아있는 금액이 이상해지겠지요. 이런 사태를 막기위해서, 하나의 작업군(여려개의 작업)이 전부 처리가 되든지, 아니면, 전부 취소가 되는 이런 작업이 필요합니다. 이런 작업을 할 때, 트랜잭션을 이용합니다. 이런 하나의 트랜잭션 내에서의 일군의 작업이 하나로 처리되는 것을 데이터베이스 용어로 트랜잭션의 원자성(atomic)이라고 합니다.

 

또한 트랜잭션 작업이 정상적으로 끝났을 경우에는 그 변경된 자료가 어떠한 간섭 없이 저장되어야하고, 저장된 자료는 손상되지 않아야합니다. 예를 들어 Bob의 현금 인출 작업이 진행되고 있는 사이에도 Bob에게 현금을 주기전까지 어떠한 오류도 발생되어서는 안되겠지요. 이것을 구현하기 위해서 트랜잭션 기능을 제공하는 데이터베이스에서는 트랜잭션이 정상적으로 종료되었다고 알려주기 전에도 이미 하나의 트랜잭션에서 발생하는 모든 작업들은 영구저장장치(예, 하드디스크)에 기록을 해둡니다. (주, 이를 내구성(durability)이라고 합니다)

 

트랙잭션에서 중요한 또 하나의 속성은 하나의 트랜잭션은 다른 트랜잭션에 의해서 간섭받지 않아야합니다. 즉, 동시에 여러개의 트랜잭션이 발생했을 때, 각각의 트랜잭션은 다른 트랜잭션에서 변경되고 있는 자료들에 대해서는 참조하거나 간섭할 수 없어야합니다.(주, 이것을 고립성(isolation) 이라고 합니다) 예를 들어서,  모든 계좌의 현잔액 합계를 구하는 트랜잭션이 작업 중인데, Alice나 Bob의 현 잔액을 바꾸는 다른 트랜잭션에 의해서 그 계좌의 현 잔액이 바뀌게 된다면, 정확한 그 시점의 현 잔액 합계를 구할 수가 없겠지요. 그래서, 트랜잭션은 각각의 명령이 수행 될 때 마다 그 변경 사항이 데이터베이스의 원래 자료에 영향을 주는 것이 아니라, 트랜잭션 영역안에 있는 모든 작업이 끝났을 때, 한꺼번에 그 변경 사항이 데이터베이스에 적용됩니다. 이때부터 다른 트랜잭션이 그 변경된 데이터를 참조 할 수 있게 됩니다. (주, 이것을 정합성(consistency)이라고 합니다) 

 

PostgreSQL에서 트랜잭션 작업을 하려면, 그 해당 작업 앞뒤로 BEGIN 명령과 COMMIT 명령을 지정합니다. 다음과 같은 형태가 트랙잭션을 사용하는 예입니다:

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
-- etc etc
COMMIT;

물론, 이 트랜잭션 작업 도중 의도적으로 모든 작업을 취소 해야할 상황이 발생하면, COMMIT 명령 대신에 ROLLBACK 명령을 사용하면 됩니다.

 

PostgreSQL에서는 내부적으로 모든 각각의 SQL 작업에 대해서 각각의 트랜잭션을 만들고, 그 명령이 성공하면, COMMIT 처리를 합니다. 내부적으로 일어나는 일이여서 사용자는 모르고 있겠지만, 개념적인 이해를 위해서 설명드립니다. PostgreSQL에서는 단지, 하나의 작업군이 모두 처리 되든지, 아니면 모두 처리 되지 않던지 하는 작업이 필요할 경우에 사용자가 직접 BEGIN, COMMIT 명령을 지정해서 트랜잭션 영역을 지정하고 작업하면 됩니다.

참고: S몇몇 클라이언트 라이브러리는 자동으로 BEGIN, COMMIT c명령을 붙혀 실행되기 때문에, 사용자가 트랜잭션 지정하면 오류를 내는 경우도 있습니다. 자세한 것은 해당 라이브러리 문서를 참조하십시오.

[Top]
No.
제목
작성자
작성일
조회
5043유저 가이드 schema 전체번역한 것입니다. [1]
이현희
2003-11-09
9708
4969자습서 - 3. 고급 기능 - 3.6 끝맺음 [2]
김상기
2003-09-23
6456
4968자습서 - 3. 고급 기능 - 3.5 상속
김상기
2003-09-23
6789
4967자습서 - 3. 고급 기능 - 3.4 트랜잭션
김상기
2003-09-23
7107
4961자습서 - 3. 고급 기능 - 3.3 Foreign Key [1]
김상기
2003-09-18
6479
4959자습서 - 3. 고급 기능 - 3.2 뷰(view)
김상기
2003-09-18
6276
4958자습서 - 3. 고급 기능 - 3.1 소개
김상기
2003-09-18
5886
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다