Dlise
시원한 냉장고
Dlise
전체 방문자
오늘
어제
  • 시원한 냉장고 (132)
    • Java (31)
      • Java (26)
      • Spring (5)
    • Algorithm & PS (25)
      • Algorithm (14)
      • Problem Solving (11)
    • Network (12)
    • Database (2)
    • Data Structure (4)
    • OOP & CleanCode (5)
    • Web (0)
    • Git (2)
    • AI (2)
    • Project (1)
      • Discord Bot (1)
    • Error (19)
    • Tools (5)
    • 수학 (5)
      • 확률과 통계(기초) (5)
    • 컴퓨터 구조 (3)
    • 활동 (16)
      • 행사 & 여행 (6)
      • 자격증 (4)
      • 회고 (6)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 통계학
  • CleanCode
  • 후위 표기법
  • java
  • spring security in action second edition
  • 가장쉬운알고리즘책
  • 열혈강의자료구조
  • 중위 표기법
  • 네트워크
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Dlise
Database

Database - 트랜잭션(Transaction)

Database

Database - 트랜잭션(Transaction)

2024. 7. 13. 23:29

최근 ERD 설계를 진행하고 있는데 DB에 대한 지식이 생각보다 부족하다고 느껴 개인적으로 중요하다고 생각하는 내용들을 정리하고자 한다.

 

 

트랜잭션

DBMS는 DB가 항상 정확하고 일관된 상태를 유지할 수 있도록 다양한 기능을 제공한다. 

트랜잭션(Transaction)은 이러한 기능들 중 하나이다.

 

트랜잭션은 하나의 작업을 수행하는 데 필요한 DB의 연산들을 모아놓은 것으로 논리적인 작업의 단위가 된다.

일반적으로 DB는 SQL문을 활용하므로 SQL문의 모임이라고 생각해도 된다.

 

상의 판매를 예로 들어보자.

만약 100개 중 1개가 판매되었다면 데이터를 최신화하기 위해 아래의 과정을 거쳐야 한다.

  1. 재고 수를 1 낮춘다.
  2. 판매 수를 1 높인다.

즉, UPDATE문이 두 번 실행되어야 한다. 

이 과정을 트랜잭션으로 구성하면 "상의 판매"라는 논리적인 작업을 한 번에 수행할 수 있다.

 

 

트랜잭션의 특성

트랜잭션이 올바르게 수행되어 DB의 무결성과 일관성이 보장되려면 아래 네 가지의 특성을 만족해야 한다.

  • 원자성(Atomicity)
  • 일관성(Consistency)
  • 독립성(Isolation)
  • 영구성(Durability)

이를 ACID 특성이라고도 부른다. 이들을 하나씩 알아보자.

 

원자성

원자성은 트랜잭션을 구성하는 연산들이 모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다는 것이다.

만약 트랜잭션을 수행하다가 오류가 발생해 모든 과정을 거치지 못했다면 지금까지의 동작을 취소하고 트랜잭션 작업 이전의 상태로 되돌려야 한다. 이를 보장하기 위해 오류 발생 시 상태를 복구하는 회복 기능이 있어야 한다.


일관성

일관성은 트랜잭션이 성공적으로 수행된 후 DB가 일관된 상태를 유지해야 한다는 것이다.

트랜잭션 동작 중에는 데이터가 일관되지 않더라도 동작 전, 후의 데이터엔 모순이 없어야 한다.


독립성

독립성은 격리성이라고도 하며 수행 중인 트랜잭션이 완료될 때까지 다른 트랜잭션들이 접근할 수 없는 것을 말한다.

트랜잭션은 동시에 수행되지만 각 트랜잭션이 독립적으로 동작할 수 있도록 중간 연산 중에 접근할 수 없다.

만약 상의 판매 트랜잭션 수행 중 다른 SQL문이 수행되면 위의 경우처럼 데이터의 일관성이 깨진다.

이를 방지하기 위해 격리성을 만족해야 한다.


영구성

영구성은 지속성, 영속성이라고도 불리며 트랜잭션이 성공적으로 완료된 후 DB에 반영한 결과는 손실되지 않고 영구적이어야 한다는 특징이다.

즉, 장애가 발생해도 트랜잭션 작업의 결과는 없어지지 않고 DB에 남아있어야 한다는 것이다.

 

 

트랜잭션의 연산

트랜잭션의 수행과 긴밀한 연산으로는 commit과 rollback이 있다.

  • commit은 트랜잭션이 성공적으로 수행되었음을 선언하는 연산으로 해당 연산이 실행되어야 수행 결과가 DB에 반영된다.
  • rollback은 트랜잭션 수행이 실패했음을 선언하는 연산으로 해당 연산이 실행되면 지금까지의 연산 결과가 취소되고 트랜잭션 실행 전 상태로 돌아간다. 이를 통해 데이터의 모순을 해결할 수 있다.

 

트랜잭션의 상태

트랜잭션은 5가지 상태 중 하나에 속한다.

활동

활동(active) 상태는 트랜잭션이 수행되기 시작해 현재 수행 중인 상태이다.

 

부분 완료

부분 완료(partially committed) 상태는 트랜잭션의 마지막 연산이 실행된 직후의 상태로 모든 연산을 끝냈지만 아직 commit을 하지 않았을 때이다.

commit 연산을 실행하지 않았기에 아직 DB에 반영되지 않은 상황이므로 완료했다고 볼 수 없다. 상황에 따라 실패 상태로 넘어갈 수도 있다.

 

완료

완료(committed) 상태는 트랜잭션이 성공적으로 완료되고 commit 연산을 실행한 상태이다. 이 상태가 되면 최종 결과를 DB에 반영하고 이 동작이 끝나면 트랜잭션이 종료된다.

 

실패

실패(failed) 상태는 HW 혹은 SW 문제 등으로 장애가 발생해 트랜잭션의 동작이 멈춘 상태이다. 정상적으로 과정을 끝낼 수 없을 때 이 상태가 된다.

 

철회

철회(aborted) 상태는 실패 상태에서 rollback 연산을 실행한 상태를 말한다. 철회 상태를 거쳐 종료된 트랜잭션은 처음부터 다시 실행되거나 폐기된다. 일반적으로 HW 혹은 SW 오류로 중단된 경우엔 다시 실행되고 SQL문의 오류가 있는 경우엔 폐기된다.

 

 

MySQL 동작 연습

내용을 알아봤으니 간단하게 트랜잭션을 동작시켜 보자.

 

먼저 transaction_practice DB를 생성한 후 store 테이블을 만들었다.

create database transaction_practice;

use transaction_practice;
create table store (
    stock int(11),
    sale int(11)
);

insert into store values(100, 0);
select * from store;

 

 

이제 재고를 1 줄이고 판매를 1 늘리는 트랜잭션을 실행해 보자.

start transaction;

update store set stock = (stock - 1);
update store set sale = (sale + 1);

commit;

select * from store;

올바르게 값이 바뀌었음을 확인할 수 있다.

 

commit을 rollback으로 바꾸고 다시 실행해 보자.

start transaction;

update store set stock = (stock - 1);
update store set sale = (sale + 1);

rollback;

select * from store;

몇 번을 실행시켜도 결과는 달라지지 않는다.

rollback 연산으로 인해 데이터가 transaction 실행 전 상태로 유지되기 때문이다.

 

* DDL문은 rollback 대상이 아니라고 한다.

 

 

'Database' 카테고리의 다른 글

Database - 테이블 관계 설정  (2) 2024.07.14
  • 트랜잭션
  • 트랜잭션의 특성
  • 트랜잭션의 연산
  • 트랜잭션의 상태
  • MySQL 동작 연습
'Database' 카테고리의 다른 글
  • Database - 테이블 관계 설정
Dlise
Dlise

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.