데이터베이스에서 사용되는 트랜잭션은 기본 동작의 단위가 되므로 중요한 개념이다. 트랜잭션에 대해 알아보자.
트랜잭션 (Transaction)이란?
단일한 논리적인 작업 단위, 즉 더이상 분할이 불가능한 업무처리 단위이다.
데이터베이스에서 트랜잭션의 의미를 적용해본다면 한꺼번에 수행되어야 할 일련의 연산 모음집이라고 생각하면 되겠다.
SQL문을 실행할 때, 일부의 쿼리만 성공한다면 DB에 실제로 반영되는 일은 일어나지 않는다. 하나의 SQL 쿼리문이 트랜잭션이기 때문이다.
커밋 (Commit)
지금까지 작업한 내용을 DB에 영구적으로 저장한다.
트랜잭션을 종료한다.
롤백 (Rollback)
지금까지 작업들을 모두 취소하고 트랜잭션 이전 상태로 되돌린다.
트랜잭선을 종료한다.
자동 커밋 (Autocommit)
각각의 SQL문을 자동으로 트랜잭션 처리 해주는 개념
SQL문이 성공적으로 실행하면 자동으로 커밋한다.
실행 중에 문제가 있었다면 알아서 롤백 한다.
MySQL에서는 autocommit이 기본값으로 설정되어있다.
그 외 대부분의 DBMS에서도 같은 기능을 제공한다.
트랜잭션 로직
- 트랜잭션을 시작한다.
- 데이터를 읽거나 쓰는 등의 SQL문들을 포함해서 로직을 수행한다.
- 일련의 과정들이 문제없이 동작했다면 트랜잭션을 커밋한다.
- 중간에 문제가 발생했다면 트랜잭션을 롤백한다.
트랜잭션 상태
아래의 그림은 보다 세부적인 과정 및 상태를 나타낸다.
Active (활성)
트랜잭션 활동 상태. 트랜잭션이 실행 중이며, 동작 중인 상태이다.
Partially Committed (부분 완료)
트랜잭션의 Commit 명령이 도착한 상태. 트랜잭션의 Commit 이전 SQL문이 수행되고, Commit만 남은 상태를 뜻한다.
Faild (실패)
트랜잭션 실패 상태. 더이상 트랜잭션이 정상적으로 진행될 수 없는 상태이다.
Committed (완료)
트랜잭션 완료 상태. Partially Committed에서 Commit 명령어가 성공적으로 실행되고 나면 완료 상태가 된다.
Aborted (철회)
트랜잭션 취소 상태. 트랜잭션이 취소되어 트랜잭션 실행 이전 상태로 돌아간 상태이다. 트랜잭션 실행에 실패한 Failed 상태에서 Rollback 연산이 수행된 상태를 뜻한다.
트랜잭션의 속성 (ACID)
Atomicity (원자성)
트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.
- 트랜잭션은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 한다.
- 만약 중간에 SQL문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 롤백한다.
Consistency (일관성)
트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다.
- 트랜잭션은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.
- 이를 위해 트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조된 데이터베이스로 진행된다.
- 제약 조건, 트리거 등을 통해 DB에 정의된 규칙들을 트랜잭션이 위반했다면 롤백해야 한다. 트랜잭션이 DB에 정의된 규칙을 위반했는지는 DBMS가 커밋 전에 확인하고 알려준다.
- 그 외 애플리케이션 관점에서 트랜잭션이 일관성 있게 동작하는지는 개발자가 챙겨야 한다.
Isolation (독립성)
어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 것을 나타낸다.
- 여러 트랜잭션들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
- DBMS는 여러 종류의 isolation level을 제공한다. 개발자는 isolation level 중 어떤 level로 트랜잭션을 동작시킬지 설정할 수 있다.
- 동시성 제어의 주된 목표가 isolation이다.
Durability (영구성)
트랜잭션이 성공적으로 완료됐을 경우, 그 결과가 영구적으로 반영되어야 하는 것이다.
- 커밋된 트랜잭션은 DB에 영구적으로 저장한다. 즉, DB 시스템에 문제가 생겨도 커밋된 트랜잭션은 DB에 남아 있는다.
- '영구 저장'은 일반적으로 '비휘발성 메모리 (HDD, SSD 등)에 저장함'을 의미한다.
- 기본적으로 트랜잭션의 영구성은 DBMS가 보장한다.
정리
트랜잭션을 어떻게 정의해서 사용할 지는 개발자가 정하는 것이다.
구현하려는 기능과 ACID 속성을 이해해야 트랜잭션을 잘 정의할 수 있다. DBMS가 모든 것을 다 해주지 않기 때문에, 개발자가 잘 챙겨줘야 한다.
Reference
https://www.youtube.com/watch?v=sLJ8ypeHGlM&t=4s
'CS 지식 > Database' 카테고리의 다른 글
[DB] 인덱스 (Index) (0) | 2024.04.30 |
---|---|
[DB] 정규화 (Normalization) (0) | 2024.01.24 |