• 검색 결과가 없습니다.

트랜잭션 개요

문서에서 01.관계형 데이터베이스 개요 (페이지 28-34)

트랜잭션은 데이터베이스의 논리적 연산단위이다. 트랜잭션(TRANSACTION)이란 밀접히 관련되어 분 리될 수 없는 한 개 이상의 데이터베이스 조작을 가리킨다. 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함된다. 트랜잭션은 분할할 수 없는 최소의 단위이다. 그렇기 때문에 전부 적용하거나 전 부 취소한다. 즉, TRANSACTION 은 ALL OR NOTHING 의 개념인 것이다. 은행에서의 계좌이체 상 황을 연상하면 트랜잭션을 이해하는데 도움이 된다. 계좌이체는 최소한 두 가지 이상의 작업으로 이루어져 있다. 우선 자신의 계좌에서 잔액을 확인하고 이체할 금액을 인출한 다음 나머지 금액을 저장한다. 그리고 이체할 계좌를 확인하고 앞에서 인출한 금액을 더한 다음에 저장하면 계좌이체가 성공한다.

계좌이체 사례 - STEP1. 100 번 계좌의 잔액에서 10,000 원을 뺀다. - STEP2. 200 번 계좌의 잔액 에 10,000 원을 더한다.

계좌이체라는 작업 단위는 이런 두 개의 업데이트가 모두 성공적으로 완료되었을 때 종료된다. 둘 중 하나라도 실패할 경우 계좌이체는 원래의 금액을 유지하고 있어야만 한다. 만약 어떠한 장애에 의해 어느 쪽이든 한 쪽만 실행했을 경우, 이체한 금액은 어디로 증발해 버렸거나 마음대로 증가하 게 된다. 당연히 그런 일이 있어서는 안 되므로 이러한 경우에는 수정을 취소하여 원 상태로 되돌려 야 한다. 이런 계좌이체 같은 하나의 논리적인 작업 단위를 구성하는 세부적인 연산들의 집합을 트 랜잭션이라 한다. 이런 관점에서 데이터베이스 응용 프로그램은 트랜잭션의 집합으로 정의할 수도 있다.

올바르게 반영된 데이터를 데이터베이스에 반영시키는 것을 커밋(COMMIT), 트랜잭션 시작 이전의 상태로 되돌리는 것을 롤백(ROLLBACK)이라고 하며, 저장점(SAVEPOINT) 기능과 함께 3 가지 명령 어를 트랜잭션을 콘트롤하는 TCL(TRANSACTION CONTROL LANGUAGE)로 분류한다. 트랜잭션 의 대상이 되는 SQL 문은 UPDATE, INSERT, DELETE 등 데이터를 수정하는 DML 문이다.

SELECT 문장은 직접적인 트랜잭션의 대상이 아니지만, SELECT FOR UPDATE 등 배타적 LOCK 을 요구하는 SELECT 문장은 트랜잭션의 대상이 될 수 있다. 트랜잭션의 특성을 살펴보면 [표 Ⅱ-1-14]와 같다.

계좌이체는 한 계좌에서 현금이 인출된 후에 다른 계좌로 입금이 되는데. 현금이 인출되기 전에 다 른 계좌에 입금이 되는 것은 문제를 발생시킬 수 있다. 그리고 이체가 결정되기 전까지는 다른 사람 이 이 계좌의 정보를 변경할 수 없다. 이것을 보통 문에 자물쇠를 채우듯이 한다고 하여 잠금 (LOCKING)이라고 표현한다. 트랜잭션의 특성(특히 원자성)을 충족하기 위해 데이터베이스는 다양한 레벨의 잠금 기능을 제공하고 있는데, 잠금은 기본적으로 트랜잭션이 수행하는 동안 특정 데이터에

대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법이다. 잠금이 걸린 데이터는 잠금

[예제] Oracle INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1997035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다.

[예제] SQL Server INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1997035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다.

[예제] PLAYER 테이블에 있는 데이터를 수정한다.

[예제] SQL Server UPDATE PLAYER SET HEIGHT = 100; 480 개의 행이 수정되었다.

[예제] PLAYER 테이블에 있는 데이터를 삭제한다.

[예제] SQL Server DELETE FROM PLAYER; 480 개의 행이 삭제되었다. SET IMPLICIT TRANSACTION ON 을 사용하면 된다.

3) 명시적 트랜잭션 트랜잭션의 시작과 끝을 모두 사용자가 명시적으로 지정하는 방식이다. BEGIN TRANSACTION (BEGIN TRAN 구문도 가능)으로 트랜잭션을 시작하고 COMMIT TRANSACTION(TRANSACTION 은 생략 가능) 또는 ROLLBACK TRANSACTION(TRANSACTION 은 생략 가능)으로 트랜잭션을 종료한다. ROLLBACK 구문을 만나면 최초의 BEGIN

[예제] Oracle INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다.

[예제] SQL Server BEGIN TRAN INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다. ROLLBACK; 롤백이 완료되었다.

[예제] PLAYER 테이블에 있는 데이터를 수정하고 ROLLBACK 을 실행한다.

[예제] SQL Server BEGIN TRAN UPDATE PLAYER SET HEIGHT = 100; 480 개의 행이 수정되었다.

ROLLBACK; 롤백이 완료되었다.

[예제] PLAYER 테이블에 있는 데이터를 삭제하고 ROLLBACK 을 실행한다.

[예제] SQL Server BEGIN TRAN DELETE FROM PLAYER; 480 개의 행이 삭제되었다. ROLLBACK; 롤백이 완료되었다.

[예제] Oracle SAVEPOINT SVPT1; 저장점이 생성되었다. INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다. ROLLBACK TO SVPT1; 롤백이 완료되었다.

[예제] SQL Server SAVE TRAN SVTR1; 저장점이 생성되었다. INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다. ROLLBACK TRAN SVTR1; 롤백이 완료되었다.

[예제] 먼저 SAVEPOINT 를 지정하고 PLAYER 테이블에 있는 데이터를 수정한 다음 롤백 (ROLLBACK)을 이전에 설정한 저장점까지 실행한다.

[예제] Oracle SAVEPOINT SVPT2; 저장점이 생성되었다. UPDATE PLAYER SET WEIGHT = 100; 480 개의 행이 수정되었다. ROLLBACK TO SVPT2; 롤백이 완료되었다.

[예제] SQL Server SAVE TRAN SVTR2; 저장점이 생성되었다. UPDATE PLAYER SET WEIGHT = 100;

480 개의 행이 수정되었다. ROLLBACK TRAN SVTR2; 롤백이 완료되었다.

[예제] SAVEPOINT 를 지정하고, PLAYER 테이블에 있는 데이터를 삭제한 다음 롤백(ROLLBACK)을 이전에 설정한 저장점까지 실행한다.

[예제] Oracle SAVEPOINT SVPT3; 저장점이 생성되었다. DELETE FROM PLAYER; 480 개의 행이 삭제되었 다. ROLLBACK TO SVPT3; 롤백이 완료되었다.

[예제] SQL Server SAVE TRAN SVTR3; 저장점이 생성되었다. DELETE FROM PLAYER; 480 개의 행이 삭 제되었다. ROLLBACK TRAN SVTR3; 롤백이 완료되었다.

[그림 Ⅱ-1-11]에서 보듯이 저장점 A 로 되돌리고 나서 다시 B 와 같이 미래 방향으로 되돌릴 수는 없다. 일단 특정 저장점까지 롤백하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문이다. 즉,

‘ROLLBACK TO A’를 실행한 시점에서 저장점 A 이후에 정의한 저장점 B 는 존재하지 않는다. 저 장점 지정 없이 “ROLLBACK”을 실행했을 경우 반영안된 모든 변경 사항을 취소하고 트랜잭션 시 작 위치로 되돌아간다.

[예제] 새로운 트랜잭션을 시작하기 전에 PLAYER 테이블의 데이터 건수와 몸무게가 100 인 선수의 데이터 건수를 확인한다. ※ 몸무게를 확인할 수 있는 WHERE 절 조건과 데이터 건수를 집계하기 위한 COUNT 함수는 1 장 5 절과 6 절에서 설명한다.

[예제 및 실행 결과] Oracle SELECT COUNT(*) FROM PLAYER; COUNT(*) --- 480 1 개의 행이 선택되 었다. SELECT COUNT(*) FROM PLAYER WHERE WEIGHT = 100; COUNT(*) --- 0 1 개의 행이 선택되 었다.

[예제] [그림 Ⅱ-1-11]을 확인하기 위해 새로운 트랜잭션을 시작하고 SAVEPOINT A 와 SAVEPOINT B 를 지정한다. (툴에 AUTO COMMIT 옵션이 적용되어 있는 경우 해제함)

[예제 및 실행 결과] Oracle 새로운 트랜잭션 시작 INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1); 1 개의 행이 만들어졌다. SAVEPOINT SVPT_A; 저장점이 생성되었다. UPDATE PLAYER SET

WEIGHT = 100; 481 개의 행이 수정되었다. SAVEPOINT SVPT_B; 저장점이 생성되었다. DELETE FROM PLAYER; 481 개의 행이 삭제되었다. 현재 위치에서 [예제] CASE 1,2,3 을 순서대로 수행해본다.

[예제] CASE1. SAVEPOINT B 저장점까지 롤백(ROLLBACK)을 수행하고 롤백 전후 데이터를 확인해 본다.

[예제 및 실행 결과] Oracle SELECT COUNT(*) FROM PLAYER; COUNT(*) --- 0 1 개의 행이 선택되 었다. ROLLBACK TO SVPT_B; 롤백이 완료되었다. SELECT COUNT(*) FROM PLAYER; COUNT(*) --- 481 1 개의 행이 선택되었다.

[예제] CASE2. SAVEPOINT A 저장점까지 롤백(ROLLBACK)을 수행하고 롤백 전후 데이터를 확인 해본다.

[예제 및 실행 결과] Oracle SELECT COUNT(*) FROM PLAYER WHERE WEIGHT = 100; COUNT(*) --- 481 1 개의 행이 선택되었다. ROLLBACK TO SVPT_A; 롤백이 완료되었다. SELECT COUNT(*) FROM PLAYER WHERE WEIGHT = 100; COUNT(*) --- 0 1 개의 행이 선택되었다.

[예제] CASE3. 트랜잭션 최초 시점까지 롤백(ROLLBACK)을 수행하고 롤백 전후 데이터를 확인해본 다.

[예제 및 실행 결과] Oracle SELECT COUNT(*) FROM PLAYER; COUNT(*) --- 481 1 개의 행이 선택되 었다. ROLLBACK; 롤백이 완료되었다. SELECT COUNT(*) FROM PLAYER; COUNT(*) --- 480 1 개의 행이 선택되었다.

앞서 배운 트랜잭션에 대해서 다시 한 번 정리한다.

해당 테이블에 데이터의 변경을 발생시키는 입력(INSERT), 수정(UPDATE), 삭제(DELETE) 수행시 그 변경되는 데이터의 무결성을 보장하는 것이 커밋(COMMIT)과 롤백(ROLLBACK)의 목적이다. 커밋 (COMMIT)은 “변경된 데이터를 테이블이 영구적으로 반영해라”라는 의미를 갖는 것이고, 롤백 (ROLLBACK)은 “변경된 데이터가 문제가 있으니 변경 전 데이터로 복귀하라”라는 의미이다. 저장점 (SAVEPOINT/SAVE TRANSACTION)은 “데이터 변경을 사전에 지정한 저장점까지만 롤백하라”는 의미이다. Oracle 의 트랜잭션은 트랜잭션의 대상이 되는 SQL 문장을 실행하면 자동으로 시작되고, COMMIT 또는 ROLLBACK 을 실행한 시점에서 종료된다. 단, 다음의 경우에는 COMMIT 과 ROLLBACK 을 실행하지 않아도 자동으로 트랜잭션이 종료된다.

- CREATE, ALTER, DROP, RENAME, TRUNCATE TABLE 등 DDL 문장을 실행하면 그 전후 시점 에 자동으로 커밋된다. - 부연하면, DML 문장 이후에 커밋 없이 DDL 문장이 실행되면 DDL 수행 전 에 자동으로 커밋된다. - 데이터베이스를 정상적으로 접속을 종료하면 자동으로 트랜잭션이 커밋된 다. - 애플리케이션의 이상 종료로 데이터베이스와의 접속이 단절되었을 때는 트랜잭션이 자동으로 롤백된다.

SQL Server 의 트랜잭션은 DBMS 가 트랜잭션을 컨트롤하는 방식인 AUTO COMMIT 이 기본 방식 이다. 다음의 경우는 Oracle 과 같이 자동으로 트랜잭션이 종료된다.

- 애플리케이션의 이상 종료로 데이터베이스(인스턴스)와의 접속이 단절되었을 때는 트랜잭션이 자동 으로 롤백된다.

문서에서 01.관계형 데이터베이스 개요 (페이지 28-34)

관련 문서