본문 바로가기
Language/mySQL

공부 내용 정리 mySQL :: 트랜잭션(Transaction)

by Cs.Woo 2021. 7. 31.

Transaction

출처


1. Transaction 이란?

  • 트랜잭션(Transaction)의 사전적 의미는 거래이고, 컴퓨터 과학 분야에서의 트랜잭션(Transaction)은 "더이상 분할이 불가능한 업무처리의 단위"를 의미한다.

 

  • 이것은 하나의 작업을 위해 더이상 분할될 수 없는 명령들의 모음, 즉, 한꺼번에 수행되어야 할 일련의 연산모음을 의미한다. 이해를 위하여 다음의 상황을 보자.

 

- 다음과 같은 상황이 있다고 가정하자.

1. 타국에서 유학을 하고 있는 A가 있다. A는 매달 10일에 부모님에게 생활비를 송금받는다. 

2. 어느 날, 부모님이 A에게 생활비를 송금해 주기 위해 ATM을 이용했고 여느날 처럼 A의 계좌로 생활비를 송금했다.

3. 그러나 모종의 이유로 인하여 부모님의 계좌에선 생활비가 차감되었는데, A의 계좌에는 생활비가 입금되지 않았다.

 

 

  • 이와 같을 때, A의 부모님이 송금한 돈을 다시 받으려면(상황을 다시 정상으로 돌리려면) 어떻게 해야할까?

 

- 1. A의 계좌에 부모님이 송금한 생활비 만큼을 더해준다

- 2. 부모님의 계좌에 송금에 실패한 생활비만큼을 다시 더해준다.

 

  • 그러나 만일, 두개의 방법(작업)이 은행원들의 실수로 인하여 동시에 일어났다면 어떻게 될까? 그 역시 치명적인 문제가 발생한다.

 

  • 이러한 문제를 피하기 위해서는 솔루션이 하나의 작업으로 묶여서 실행되어야만 하는 것이다. 이것이 바로 트랜잭션이다.

 

  • 이와 같이, 데이터베이스와 어플리케이션의 데이터 거래(Transaction)에 있어서 안전성을 확보하기 위한 방법이 트랜잭션인 것이다.

 

  • 데이터베이스에서 테이블의 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면 결과를 재반영 하는 것이 아니라 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성공하였을때 만 그 결과를 반영하는 것이 데이터베이스에 있어서의 트랜잭션이다.

 

2. Transaction의 특징

  • 트랜잭션은 다음의 특징을 갖고있다.
- ACID

1. 원자성(Atomicity)
2. 일관성(Consistency)
3. 독립성(Isonlation)
4. 지속성(Durability)

 

   1. 트랜잭션은 작업하고자 하는 모든 데이터베이스에 반영되던가 그렇지 않으면 전혀 반영되지 말아야 한다. (원자성)

 

  트랜잭션은 어떠한 작업을 위하여 사람이 설계한 작업 단위로서, 트랜잭션의 단위로 일처리가 이루어지지 않는다면, 작업 설게자는 해당 시스템을 이해하기 어려울 뿐만 아니라 작업에 오류가 있을 시, 그 원인을 찾고 해결하는데에 어려움이 발생하기 때문이다.

 

   2.  트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다. (일관성)

 

  트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이슬 진행되는 것이다.

 

  상기의 예시와 같이, 계좌이체가 성공하였다면, A의 원래 통장 잔고와 부모님의 통장잔고의 합이 계좌이체의 전과 같아야만 하는 것이다.

 

   3. 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산(작업)에 관여할 수 없다.(고립성)

 

  하나의 특정 트랜잭션(작업)이 완료될 때 까지 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.  은행의 예제

에서 하나의 은행원이 A와 부모님의 계좌이체건을 담당하고 있으면, 다른 은행원은 똑같은 건으로 해당 업무를 처리할 수 없는것, 그것이 바로 고립성인것이다.

 

   4.  트랜잭션이 성공적으로 완료되었을 경우, 그 결과는 영구적으로 반영되어야 한다.(지속성)

 

    트랜잭션이 완료되면(작업이 종료되면), 그 결과가 저장되어있는 데이터베이스에 반영이 되어 저장되어야 한다는 의미이다. 트랜잭션의 결과가 메모리에만 반영되고 실제 데이터베이스 반영되지 않아서, 시스템 종료 후 재시작 했을때 해당 트랜잭션의 결과가 반영되어있지 않으면 아니된다 라는 의미이다.

3. Transaction의 상태

  • 트랜잭션의 개념은 1장에서 서술한 바와 같이 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 혹은 데이터베이스 시스템에서 복구 및 병행 수행시 처리되는 작업의 논리적 단위이다.

 

  • 트랜잭션의 원리와 개념의 이해를 돕기 위하여, 작업 수행의 단계별 각각의 상태를 도식화 하여 < 그림 1 >을 첨부하였다.

< 그림 1 > 트랜잭션의 연산과정 단계

출처 : 관련링크 2, https://devuna.tistory.com/30

 

[DB]트랜잭션(Transaction)이란?/트랜잭션의 개념,특징, 연산과정/savepoint

트랜잭션(Transaction)이란?/트랜잭션의 개념,특징/UNDO 복구와 REDO복구 💡 트랜잭션(Transaction)이란? 컴퓨터 과학분야에 트랜잭션은 "쪼개질 수 없는 업무처리의 단위"를 의미합니다. ATM으로 계좌

devuna.tistory.com

 

  • 트랜잭션의 연산과정의 단계를 도식화하고 각각의 단계의 상태를 상기 < 그림 1 > 과 같이 정리할 수 있는데, 개별 상태에 대한 상세는 다음과 같다.

 

- 1. 활성(Active) : 트랜잭션이 정상적으로 실행중인 상태를 의미한다.

- 작업 성공시,
- 2-1. 부분 완료(Partially Committed) : 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태
- 2-2. 완료(Committed) : 트랜잭션이 성공이 종료되어 Commit 연산을 실행한 후의 상태

- 작업 실패시,
- 2-1. 실패(Failed): 트랜잭션 실행에 오류가 발생하여 중단된 상태.
- 2-2. 철회(Aborted): 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태.

  1.  트랜잭션이 시작되면, 해당 트랜잭션의 상태는 활동(Active)상태가 된다. 해당 상태는 설계자가 설계한 대로 연산들이 정상적으로 실행중인 상태를 의미한다.

 

  트랜잭션이 실행되면, 작업이 성공할 수도 있고 실패할 수도 있을 것이다. 우선은 성공하였을때의 상태를 살펴보겠다.

 

  2-1. 설계된 트랜잭션되로 명령을 성공적으로 수행하면 그 다음 상태는 부분적 완료(Partially Committed)상태가 된다.    설계된 작업대로 작업이 성공하였다고 하여 무조건 반영하는 것이 아니라, 설계자의 최종 승인(Commit*)이 있을 때 까지 실제 데이터베이스에 작업 내용을 반영하지 않고 기다리고 있는 상태이다.

 

*Commit : Commit이란, 모든 작업들을 정상 처리하겠다고 확정하는 명령어로서, 해당 처리 과정을 DB에 영구 저장하겠다는 의미이며, Commit을 수행하면 하나의 트랜잭션 과정이 종료되는 것이다. Commit을 수행하면 이전 데이터가 완전히 반영되어 UPDATE된다.

 

 

  2-2. 설계자가 작업 결과에 대하여 반영을 승인(Commit)한다면 트랜잭션이 성공적으로 종료된다(Committed)

 

  위와 반대로 트랜잭션이 실행된 이후, 작업을 실패하였다면 어떤 상태가 될까?

 

 

  2-1. 트랜잭션을 수행하는 중간에 모종의 원인으로 인하여 오류가 발생하여 실행이 중단된 상태를 실패(Failed)상태라고 한다.

 

  2-2. 이때 트랜잭션이 비정상적으로 종료되었으니, 설계되어있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 (ROLLBACK*) 연산을 수행하면 그 상태를 철회(Aborted)라고 한다.

 

*Roll-back : Roll-back은 작업 중 문제가 발생되어 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어이다. 해당 명령을 트랜잭션에게 하달하면, 트랜잭션은 시작되기 이전의 상태로 되돌아간다. 이것은 마지막 Commit을 완료한 시점으로 돌아간다는 말과 상통한다. 즉, Rollback은 Commit하여 저장한 상태를 복구하는 것이다

!! 주의 !!

DROP등 몇가지 명령어는 ROLLBACK 명령을 하달하여도 롤백이 되지 않으므로 주의하여 사용하자.

 

 Delete, Insert, Update 작업과 같이 여러 작업을 포함하고 있는 트랜잭션이 작업 실패를 하여 Rollback한다고 하였을 때, 작업 전체를 취소하는 것이 아니라 특정 작업을 기점으로 나머지만 취소할 수 있는 방법은 없는 것일까?


  이 때 사용하는 것이 SAVEPONT이다. 보통, Rollback을 명시하면 해당 트랜잭션이 수행하였던 모든 작업이 취소가 되는데, 특정 부분에서 작업을 취소하기 위해 savepoint를 사용할 수 있다.

  savepoint를 사용하면 해당 트랜잭션의 작업을 세분할 수 있다. saveponit는 여러개의 sql문의 실행을 수행하는 트랜잭션 중간 단계에서 지정할 수 있는데, 취소하려는 지점을 명시한 뒤 그 지점까지의 작업을 취소하는 식으로 사용된다.

savpoint를 명시하고 rollback 명령을 트랜잭션에 하달할 때, ROLLBACK TO SAVEPOINT "SAVEPOINT명" 으로 명시한다면 해당 SAVEPOINT까지는 유지하고 그 이후의 시점부터 수행된 명령을 취소한다.

 

4. Transaction 예제 및 활용

  • 이전 장에서는 Transaction의 내용을 정리하였고, 본 장에서는 Transaction의 예제 및 활용을 정리하였다.
  • 우선 Transaction을 사용하려면 저장 엔진에 대하여 알아야 한다. Mysql을 기준으로 정리하였다.

4-1. 저장엔진

  • MySQL의 기능은 크게 두가지로 나눌 수 있다.
- 첫째, 접속 및 SQL 문의 내용을 사전에 조사하는 기능 ( 데이터베이스의 상위 부분)
- 둘째, 상위 부분의 지시를 받아 실제로 데이터를 검색하거나 조작하는 기능 ( 데이터베이스의 하위 부분)
  • 저장엔진은 데이터베이스의 하위 부분을 이야기한다. MySQL에는 여러가지의 저장엔진이 존재한다. 따라서 사용자는 목적과 취향에 따라 저장엔진을 선택하는 것도 가능하다.
  • 더 나아가 테이블 별로 저장엔진을 따로 설정해주는것도 가능하다. 이와 같이 사용자가 독립된 형태의 저장 엔진을 선택할 수 있는 것은 RDBMS 중에서 MySQL만의 고유한 특징이다.
  • MySQL의 주요 저장 엔진들은 다음과 같다.

 

저장엔진 특징
MyISAM MySQL 5.1까지의 기본 엔진, 트랜잭션을 지원하지 않는다.
InnoDB MySQL 5.5 이후의 기본 엔진. 트랜잭션을 지원한다.
ISAM MySQL의 기본이 되는 저장 엔진. 예전 형식으로, MySQL 5.0부터는 설치되지 않는다.
MEMORY 데이터를 모두 메모리상에 보관하며, 동작이 빠르다
MERGE MyISAM의 여러 개의 테이블을 하나의 테이블처럼 다룬다
  • 저장 엔진을 보다 효율적으로 사용하려면 엔진별 튜닝이 필요하고, 연구하여 자신에 상황에 맞게 사용하여야 한다.

4-2. 저장엔진 확인 및 변경

  • 예제에 사용될 저장엔진은 InnoDB이다. 하기의 sql로서 설정되어있는 저장엔진을 확인하고 변경할 수 있다.

 

# 테이블 생성 및 저장엔진 확인하기
SHOW CREATE TABLE `테이블명`;

# 저장엔진을 변경하기
ALTER TABLE `테이블명` ENGIN=엔진명;

# Query Ok라고 표시되더라도 변경되지 않았을 가능성이 있다.
# 반드시 SHOW CREATE TABLE `테이블 명`을  실행하여 변경여부를 확인하자
  • 여기까지 진행하였으면 트랜잭션에 대한 예제로 넘어간다.

 

Transaction 예제

  • Transaction의 예제는 다음과 같다.
## 기본구조

# Transaction 시작
START TRANSACTION;
# 쿼리입력
COMMIT;
# 또는
# ROLLBACK;

## 사용예제

# 트랜잭션 시작
START TRANSACTION;

# 초기상태 보여줌
SELECT * 
FROM my_table;

# 데이터의 수정
DELETE FROM my_table 
WHERE gender = 'M';

# 수정 후의 상태 보여줌
SELECT * FROM my_table; 

# 트랜잭션의 시작 이전으로 돌아간다.
# ROLLBACK;

# 트랜잭션을 커밋하고 종료시킨다.
COMMIT;

# 적용된 결과를 조회한다.
SELECT * 
FROM my_table;

 

  • MySQL에서 트랜잭션 사용할 때 주의할 점은, Oracle DB와는 다르게 MySQL에서는 트랜잭션의 기본 옵션이 트랜잭션이 성공하였을 경우 자동 Commit을 하도록 설정되어있다는 것이다.
  • 자동으로 Commit을 하게 된다면, 트랜잭션을 사용하는 이유가 모호해지기 때문에 하기와 같은 쿼리를 사용하여 자동 Commit을 방지하여야 한다.

 

# 오토커밋 on
SET autocommit = ON;
# 또는 
SET autocommit = 1;

# 오토커밋 off
SET autocommit = OFF;
SET autocommit = 0;
  • 오토커밋은 트랜잭션을 시작하지 않은 상태에서도 설정이 가능하다.
  • 오토커밋의 상태를 확인하는 쿼리문은 다음과 같다.

 

# 오토쿼리 설정 확인
select @@autocommit;

# 1이면 ON이고, 0이면 OFF이다
  • 모든 명령어에 대하여 트랜잭션의 롤백 명령이 적용되는 것은 아니다. 트랜잭션이 적용되는 명령어 중에는 예외가 존재하는데, 예외 명령어를 사용한다면 트랜잭션을 시작하였을지라도 롤백명령어가 적용되지 않는다. 다음과 같다.

 

DROP DATABASE;
DROP TABLE;
DROP
ALTER TABLE
  • 상기와 같은 명령어들은 롤백을 하여도 적용되지 않는다.(롤백이 실행되지 않고 원래의 상태로 돌아 갈 수 없다.)
  • 이렇게 Transaction의 개념 및 특징, 상태 그리고 엔진까지 살펴보았다. 이 외에도 트랜잭션의 잠금(lock)기능 데드락 등 알아야 할 개념들이 많다. 해당 내용은 차후에 정리하도록 하겠다.