[DB] 트랜잭션

2023. 12. 20. 17:54CS/DataBase

 

트랜잭션은 DBMS가 데이터베이스를 다룰 때 사용하는 작업 단위이다. 트랜잭션은 데이터베이스의 무결성을 유지하기 위해 원자성, 일관성, 고립성, 지속성의 성질을 갖는다. DBMS는 트랜잭션이 이러한 성질을 유지할 수 있도록 지원한다. 각 개념에 대해 하나씩 살펴보자.

 

트랜잭션의 개념

 

트랜잭션은 DBMS에서 데이터를 다루는 논리적인 작업의 단위이다. 보통 단일 SQL문을 사용하여 다루기도 하지만 여러 개의 SQL문을 순차적으로 수행하여 다루기도 한다. 데이터베이스에서 트랜잭션을 정의하는 이유는 다음과 같다.

  • 데이터베이스에서 데이터를 다룰 때 장애가 일어나는 경우가 있다. 트랜잭션은 장애 발생 시 데이터를 복구하는 작업의 단위가 된다.
  • 데이터베이스에서 여러 작업이 동시에 같은 데이터를 다룰 때가 있다. 트랜잭션은 이 작업을 서로 분리하는 단위가 된다. 

트랜잭션은 전체가 수행되거나 또는 전혀 수행되지 않아야 한다. 예를 들어 은행 업무를 보는데 A 계좌에서 B 계좌로 10,000원을 이체할 경우 프로그램은 다음과 같다.

BEGIN
	1. A계좌에서 10,000을 인출하는 SQL UPDATE 문
    	2. B계좌에 10,000원을 입금하는 SQL UPDATE 문
END

 

만약 1번 SQL문이 수행된 다음 시스템에 문제가 생기거나 다른 UPDATE문이 끼어들어 A 계좌에서 돈을 동시에 인출하면, A 계좌와 B 계좌의 잔액이 의도하지 않는 값이 될 수 있다. 따라서 1번 SQL문과 2번 SQL문은 모두 수행되거나 아예 수행되지 않아야 한다.

 

만약 1번 SQL문을 수행한 다음 문제가 생겨 2번 SQL문을 수행할 수 없는 경우라면 1번 SQL문의 수행을 취소해야 한다. DBMS에 1번과 2번의 SQL 문이 하나의 수행 단위라는 것을 알리기 위해 사용하는 문법은 다음과 같다. START TRANSCTION 문과 COMMIT문을 사용하여 트랜잭션의 시작과 끝을 표시한다.

START TRAINSCTION
	1. A계좌에서 10,000을 인출하는 SQL UPDATE 문
    	2. B계좌에 10,000원을 입금하는 SQL UPDATE 문
COMMIT

 

위와 같이 작성하면 1번과 2번의 두 SQL 문은 하나의 논리적인 작업의 단위가 된다. DBMS는 이 두 문장이 모두 수행되거나 모두 수행되지 않도록 지원한다.

 

위 계좌이체 트랜잭션이 데이터베이스에서 실행될 때 일어나는 상황을 구체적으로 보자. 데이터베이스의 데이터는 하드디스크에 저장되어 있고, 처리를 위해서는 반드시 주기억장치 버퍼로 사본을 읽어와야 한다는 점이다. 다시 설명으로 돌아가서, 관련 예제 테이블의 스키마 구조는 다음과 같다. 테이블 이름은 Cutomer이 고객 이름과 예금액을 저장한다.

 

 

트랜잭션은 데이터베이스에 저장된 테이블을 읽어와 주기억장치 버퍼에 저장하고, 버퍼에 저장된 데이터를 수정한 후 최종적으로 데이터베이스에 다시 저장한다. 사용자 프로그램에서 3, 4에 해당하는 문장밖에 없지만 실제 처리 과정에는 DBMS가 데이터를 읽고 쓰는 1~6까지 과정이 포함되어 있다.

  1. A 계좌의 값을 하드디스크에서 주기억장치 버퍼로 읽어온다.
  2. B 계좌의 값을 하드디스크에서 주기억장치 버퍼로 읽어온다.
  3. A 계좌에서 10,000원을 인출한 값을 저장한다.
  4. B 계좌에 10,000원을 입금한 값을 저장한다.
  5. A 계좌의 값으 주기억장치 버퍼에서 하드디스크에 기록한다.
  6. B 계좌의 값을 주기억장치 버퍼에서 하드디스크에 기록한다.

COMMIT 문읜 트랜잭션의 종료를 알리는 SQL 문이다. 앞의 트랜잭션을 보면 트랜잭션의 사실적인 종료는 1~6이 완전히 끝난 후지만, DBMS는 1~4까지를 수행하고 사용자에게 완료 사실을 알린다. 그리고 나머지 5, 6 과정은 DBMS가 책임지고 수행한다. 이렇게 하는 이유는 DBMS가 동시에 많은 트랜잭션을 수행할 때 각각의 트랜잭션이 하드디스크에 개별 접근하는 것을 피하고 DBMS가 일괄적으로 하드디스크에 접근하여 처리함으로써 사용자에게 빠른 응답성을 보장하기 위해서 이다. 

 

이러한 방식을 사용하는 이유는 하드디스크라는 물리적 공간에 데이터를 읽고 쓰는 과정이 오래 걸리기 때문이다. 이 때문에 4 과정에서 트랜잭션은 임시로 종료하고 실제 데이터베이스에 기록하는 것은 DBMS에서 수행한다.

 

트랜잭션 수행과정

트랜잭션을 부분완료하여 종료를 하여 사용자가 다른 트랜잭션에게 알리는 단계이다. 부분완료된 트랜잭션은 DBMS가 다른 트랜잭션의 작업 처리 상황을 봐가면서 변경 내용을 하드디스크에 기록한다. 기록이 끝나면 완료 한다. 완료 후에는 다른 트랜잭션이 데이터를 자유롭게 사용할 수 있다.

 

트랜잭션 성질

 

트랜잭션은 일반 프로그램과 달리 데이터베이스에 저장된 데이터를 다루면 DBMS에 의해 처리된다. 트랜잭션과 프로그램의 차이점은 다음과 같다.

 

컴퓨터 시스템 내에서 트랜잭션과 프로그램의 차이를 그림으로 보면 다음과 같다. 트랜잭션은 데이터베이스에 저장된 데이터를 다루면 DBMS에 의해 처리된다. 반면 프로그램은 파일에 저장된 데이터를 다루며 DBMS 없이 직접 데이터를 처리한다.

 

트랜잭션의 4가지 성질

  1. 원자성 : 트랜잭션에 포함된 작업들은 전부 수행되거나 아니면 전부 수행되지 않아야 한다.
  2. 일관성 : 트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
  3. 고립성 : 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하는 일이 없어야 한다.
  4. 지속성 : 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다. 저장된 데이터베이스는 저장 직후 혹은 어느 때나 발생할 수 있는 정전, 장애, 오류에 영향을 받지 않아야 한다.\

원자성

원자성이란 트랜잭션이 원자처럼 더 이상 쪼개지지 않는 하나의 프로그램 단위로 동작해야 한다는 의미이다. 즉 일부만 수행되는 일이 없도록 전부 수행하거나 아예 수행하지 않아야 한다. SQL에서는 트랜잭션의 시작과 끝을 표시하기 위해  START TRANSACTION, COMMIT 문을 사용한다. 트랜잭션 중간에 작업이 잘못되면 회복 알고리즘을 이용하여 변경한 내용을 취소한다. COMMIT과 ROLLBACK 명령어는 트랜잭션 제어 명령어라고 한다.

 

트랜잭션의 길이가 길경우 중간 지점에 수정내용을 반영하는 포인트를 만드는데, 이를 SAVEPOINT라고 한다. 트랜잭션이 잘못되어 처음부터 다시 실행해야 할 경우 트랜잭션의 처음이 아니라 SAVEPOINT까지 되돌아가면 트랜잭션 전체가 ROLLBACK 되는 것을 막을 수 있다. SAVEPOINT의 경우 트랜잭션 내에 여러 개를 만들 수 있다.

 

일관성

트랜잭션은 데이터베이스의 일관성을 유지해야 한다. 일관성은 테이블이 생성될 때 CREATE 문과 ALTER 문의 무결성 제약조건을 통해 명시된다. 트랜잭션은 이 조건에 따라 일관성을 유지한다. 다만 수행 중 일시적으로 일관성을 유지하지 못하는 상태가 있을 수 있다. 예를 들어 계좌이체 트랜잭션의 경우 일관성 조건은 A 계좌 + B 계좌 = 20만 원이다. 그런데 A 계좌에서 만 원을 인출하여 B 계좌에 입금하기 전에는 총액이 일시적으로 19만 원으로 줄어드는 일관성 없는 상태가 된다. 트랜잭션이 종료된 후에는 A 계좌 + B 계좌 = 20만 원이 된다.

 

데이터베이스 변경 중과 변경 후의 일관성

 

 

고립성

데이터베이스는 공유가 목적이기 때문에 여러 트랜잭션이 동시에 수행된다. 이때 각 트랜잭션은 다른 트랜잭션의 방해를 받지 않고 독립적으로 작업을 수행한다. 이렇게 여러 트랜잭션이 동시에 수행될 때 상호 간섭이나 데이터 충돌이 일어나지 않는 현상을 고립성이라고 한다. 고립성을 유지하기 위해서는 변경 중인 임시 데이터를 다른 트랜잭션이 읽거나 쓰려고 할 때 제어하는 작업이 필요하다.

 

같은 시간에 여러 트랜잭션이 같은 데이터를 다루고 있다. 시간 t1에서 보면 트랜잭션 2와 트랜잭션 3이 실행 중이며 테이블 B를 동시에 다루고 있다. 같은 데이터를 동시에 읽고 쓸 경우, 변경 중인 데이터를 다른 트랜잭션이 사용하면 데이터의 일관성이 훼손될 수 있다. 따라서 동시 수행되는 트랜잭션이 같은 데이터를 가지고 충돌하지 않도록 제어하는 작업이 필요한다. 이 작업을 동시성 제어라고 한다.

트랜잭션 동시 수행과 데이터 공유

 

 

지속성

트랜잭션이 정상적으로완료 혹은 부분완료한 데이터는 반드시 데이터베이스에 기록되어야 한다. 이러한 성질을 트랜잭션의 지속성이라고 한다. DBMS 복구 시스템은 트랜잭션이 작업한 내용을 수시로 로그 데이터베이스에 기록하였다가 문제가 발생하면 로그 파일을 이용하여 복구 작업을 수행한다. 즉 시스템이 멈추어도 트랜잭션 수행으로 변경된 내용은 디스크에 기록된다.

 

트랜잭션은 수행 완료하면 부분완료 혹은 실패 상태 중 하나가 된다. DBMS는 부분완료 상태에서는 작업한 내용을 데이터베이스에 반영하고, 실패 상태에서는 작업한 내용을 취소한다.

 

부분완료 : 트랜잭션 수행은 완료되었지만 변경 내용이 데이터베이스에 기록되었는지 확실하지 않은 상태이다. 이 상태에서는 DBMS가 최종적으로 변경 내용을 데이터베이스에 기록해야 완료 상태가 된다. 만약 시스템 내부의 문제 혹은 시스템 다운 등으로 DBMS가 변경 내용을 데이터베이스에 기록하지 못하면 실패 상태가 된다.

 

실패 : 트랜잭션을 중간에 중단하였거나 부분완료 상태에서 변경 내용을 데이터베이스에 저장하지 못한 상태를 말한다. 실패 상태에서 DBMS는 트랜잭션이 수행한 작업을 모두 원상복구시킨다.

 

트랜잭션과 DBMS

 

DBMS는 트랜잭션이 원자성, 일관성, 고립성, 지속성을 유지할 수 있도록 지원한다. 먼저 원자성을 유지하기 위해 회복 관리자 프로그램을 작동시킨다. 회복 관리자 프로그램은 데이터베이스가 변경한 내용르 로그로 기록하고 있다가 트랜잭션에 문제가 생겼을 때 원래 상태로 되돌린다.

 

DBMS는 일관성을 유지하기 위해 무결성 제약조건을 활용한다. 트랜잭션이 수행 시 데이터에 변경이 가해지면 미리 정의해 둔 무결성 제약조건을 검사하여 일관성이 깨지는 것을 막는다. 그런데 두 개의 트랜잭션이 동시에 수행될 때 트랜잭션 간에 간섭으로 일관성이 깨지는 현상은 무결성 제약조건을 검사하는 것으로 해결할 수 있다. 동시에 같은 데이터를 접근하는 트랜잭션들이 질서 있게 접근하여 데이터베이스의 일관성을 유지하도록 하기 위해서는 동시성 제어 알고리즘을 작동시켜야 한다.

 

DBMS는 고립성을 유지하기 위해 일관성을 유지하는 것과 마찬가지로 동시성 제어 알고리즘을 작동시킨다. 두 개의 트랜잭션이 동시에 수행될 때 간섭에 의하여 데이터 값이 손상되면 고립성이 깨진다. 이 경우 동시성 제어 알고리즘을 작동시켜 여러 트랜잭션이 동시 같은 데이터를 접근할 때 마치 한 트랜잭션씩 순서대로 접근하는 것처럼 제어한다.

 

DBMS는 지속성을 유지하기 위해 회복 관리자 프로그램을 이용한다. 회복 관리자 프로그램은 데이터베이스가 변경한 내용을 로그로 기록하고 있다가 트랜잭션에 문제가 있을 때 원래 상태로 되돌린다.

 

트랜잭션의 4가지 성질과 성질을 유지시키기 위한 DBMS의 기능을 그림으로 나타내면 다음과 같다.

트랜잭션과 DBMS의 기능

 

 

'CS > DataBase' 카테고리의 다른 글

[DB] 트랜잭션 고립 수준  (0) 2023.12.21
[DB] 동시성 제어  (0) 2023.12.20
[DB] 정규화  (0) 2023.12.19
[DB] 데이터 모델링  (0) 2023.12.18
[DB] 인덱스  (0) 2023.12.15