본문 바로가기

[데이터베이스] 13-1. 트랜잭션

Notice

이 글은 다음 강의를 수강한 후 학습한 내용을 정리한 글입니다.

- 강의: [K-MOOC] 단국대학교 오세종 교수님의 '데이터베이스의 이해와 활용'

 

트랜잭션

데이터베이스의 상태를 변화시키는 업무 처리의 논리적인 단위

<예시> 제품 구매, 계좌이체, 수강 신청

 

보통 하나의 트랜잭션은 여러 작업(데이터베이스 연산: insert, update, delete 등)으로 구성되어 있다.

트랜잭션의 특징은 트랜잭션에 속한 모든 작업이 모두 정상적으로 수행되어야 수강 신청이 완료된다는 것이다.

<예시> 수강 신청 트랜잭션

- 홍길동의 수강 과목에 A 과목 추가

- A과목의 수강 가능 인원을 1명 감소시키기

 

트랜잭션은 더 이상 쪼개면 업무의 의미를 상실하는 작업(연산)의 집합이다.

영어적인 정의는 Transaction 거래이다.

물건은 전달했는데 돈이 안 왔다거나 돈을 보냈는데 물건이 안 온 경우는 비정상적인 거래이다.

 

트랜잭션의 중요성

데이터베이스에서 트랜잭션이 중요한 이유는?

트랜잭션이 비정상적으로 종료되면 데이터의 무결성, 일관성에 문제가 생길 수 있다.

 

<예시> 계좌이체

 

송금을 하는 계좌이체 트랜잭션 중간에 정전이 일어난다면? 계좌 잔액에 오류가 생기는 문제가 발생한다.

트랜잭션 모두 실행이 되든지, 하나도 실행이 되지 않든지, 즉 All or Nothing일 때 데이터베이스 시스템에서 문제를 일으키지 않는다.

 

트랜잭션은 작업 수행에 필요한 SQL문들의 집합이다.

셀렉트문은 조회만 하는 것이기 때문에 중간에 종료되어도 문제가 생기지 않는다.

트랜잭션은 보통 인서트, 딜리트를 포함한다.

트랜잭션의 특성

트랜잭션이 데이터베이스 시스템에 문제를 일으키지 않으려면 네 가지의 특성을 만족해야 한다고 알려져 있다.

 

(1) 원자성 Atomicity

'원자성'은 트랜잭션을 구성하는 작업들 전체를 하나로 보아야 한다는 의미이다.

트랜잭션을 구성하는 작업들은 전부 수행이 되거나 전혀 수행이 되지 않아야 한다.

트랜잭션이 부분적으로만 수행되는 것은 안 된다.

 

(2) 일관성 Consistency

트랜잭션을 수행하기 이전의 데이터베이스와 이후의 데이터베이스가 논리적으로 일관된 상태를 유지해야 한다는 특성이다.

<예시> 판매수량과 재고수량의 합계는 판매 전후가 같아야 한다.

 

(3) 격리성 Isolation

여러 트랜잭션들이 병렬적으로 수행되는 상황에서 트랜잭션들 간에 상호 간섭에 의한 문제를 일으키지 않는 성질.

 

격리성을 만족할 경우 병렬 수행의 결과와 순차 실행의 결과는 같게 된다.

트랜잭션의 격리성을 지키는 가장 쉬운 방법은 트랜잭션들을 순차적으로 실행하는 것이다.

문제는 순차 실행의 경우 처리 시간이 늘어나서 사용자의 요구를 일정 시간 안에 처리하는 것이 어려워진다.

DBMS 입장에서는 격리성을 유지하면서도 병렬 수행을 할 수 있는 방법이 필요하다.

 

<예시> 격리성이 깨어지고, 서로 간섭이 이루어지는 예시

 

(4) 지속성 Durability

트랜잭션이 성공적으로 완료된 후에는 트랜잭션의 수행 결과가 데이터베이스에 영구적으로 유지되는 특성이다.

트랜잭션이 성공적으로 완료되었다면 시스템에 장애가 발생했더라도 트랜잭션의 수행결과가 데이터베이스에 반드시 반영되도록 DBMS에 조치를 취해야 한다. DBMS에는 복구 recovery 기능이 필요하다.

 

트랜잭션과 관련된 연산

트랜잭션은 commit을 만나서 데이터를 데이터베이스에 영구 저장하거나 rollback을 만나 데이터베이스를 트랜잭션 시작 이전으로 돌린다.

 

Commit

트랜잭션이 성공적으로 수행되었음을 확정하는 명령어이다.

Commit 연산을 하면 트랜잭션의 수행결과가 데이터베이스에 영구적으로 기록된다.

Commit이 이루어질 때만 트랜잭션 전체의 작업 결과를 한 번에 데이터베이스에 저장한다.

작업하다가 중간에 작업이 중단됐다면 부분 실행결과를 취소한다.(rollback)

 

Rollback

트랜잭션의 처리 과정에서 발생한 변경 사항을 취소하고, 트랜잭션 과정을 종료시키는 명령어이다.

개발자가 내릴 수도 있고, DBMS에 의해서 rolllback 연산이 수행될 수도 있다.

롤백은 트랜잭션을 아예 실행을 안 한 것처럼 최초의 상태로 되돌리는 연산이다.

 

MySQL에서 commit 명령을 내리지 않아도 데이터가 저장되는 이유는?
MySQL에서는 하나의 sql문을 하나의 트랜잭션으로 간주하기 때문에 갱신 연산이 실행되는 즉시 데이터가 영구 저장된다.
오토 커밋 모드를 off시켜야 commit과 rollback을 확인할 수 있다.