[Database] 트랜잭션의 정의와 수행진행, 트랜잭션의 성질 ACID를 알아보자

    트랜잭션(Transaction)

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

    데이터베이스에서 트랜잭션을 정의하는 이유는 다음과 같다

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

    트랜잭션의 수행
    트랜잭션은 전체가 수행되거나 또는 전혀 수행되지 않아야 한다(all or nothing). 예를 들어 은행 업무를 보는데 A계좌에서 돈을 이체하고 B계좌에 돈을 입금한다고 하자 이것은 두개의 UPDATE문으로 나뉘어 질수 있다. 만약 A계좌에서 돈을 인출하고 나서 B계좌에 돈을 입금할 때 UPDATE문 하나가 에러 난다면 A계좌와 B계좌의 잔액이 의도하지 않는 값이 될수 있다. 그래서 트랜잭션으로 두개의 UPDATE문을 하나의 작업으로 묶어 두개의 UPDATE문이 하나라도 정상적으로 수행되지 않는다면 이 트랜잭션은 전혀 수행되지 않아야 한다. 

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

    START TRANSACTION 문과 COMMIT문을 사용하여 트랜잭션의 시작과 끝을 표시한다. 위와 같이 작성하면 두 SQL 문은 하나의 논리적인 작업의 단위가 된다. DBMS는 이 두 문장이 모두 수행되거나 모두 수행되지 않도록 지원한다.

    다음 이 작업의 세부적인 과정을 보자
    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가 책임지고 수행한다. 1~4까지 수행하고 사용자에게 완료 사실을 알리는 이유는 사용자에게 빠른 응답성을 보장하기 위해서이다.

    [트랜잭션의 수행 과정]


    트랜잭션의 성질

    트랜잭션은 네 가지 성질이 있고, 영문 앞 글자를 따서 보통 ACID 성질이라고 한다

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

    트랜잭션 중간에 작업이 잘못되면 회복 알고리즘으로 변경한 내용을 취소한다(자의적으로 트랜잭션을 취소하는 명령어 ROLLBACK을 사용하기도 한다). COMMIT과 ROLLBACK 명령어는 트랜잭션 제어 명령어(TCL, Transaction Control Language)라고 한다.
    트랜잭션의 길이가 길면 트랜잭션의 중간 지점에 수정내용을 반영하는 포인트를 만드는데, 이를 SAVEPOINT(저장점)라고 한다. 트랜잭션이 잘못되어 처음부터 다시 실행해야 할 경우 트랜잭션의 처음이 아니라 SAVEPOINT까지 되돌아가면 트랜잭션 전체가 ROLLBACK되는 것을 막을 수 있다. SAVEPOINT는 트랜잭션 안에 여러 개 만들 수 있다. 




    댓글

    Designed by JB FACTORY