트랜잭션이란
트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.
트랜잭션이란 개념이 필요한 이유
예를들어, A가 B에게 5000원을 계좌이체하는 시나리오를 생각해보자.
만약 계좌이체를 실행할 시에는 아래의 두가지의 변화가 생길 것 이다.
1. A의 계좌에서 -5000원
2. B의 계좌에서 +5000원
하지만 만약, 이 경우에서 1번의 작업은 정상적으로 성공했지만, 2번의 작업이 실패한다면, 어떻게 될까?
A의 잔고는 -5000원 되었지만 B의 계좌는 5000원이 입고된 것이 아니라 그대로일 것이다.
이러한 문제점을 해결하기 위해서 트랜잭션이라는 개념이 생기고, 사용되는 것이다.
데이터베이스가 제공하는 트랜잭션의 기능을 사용하면 1,2가 모두 성공해야 상태를 저장하고, 만약 1번과 2번 둘 중 하나라도 실패하면 이전의 상태로 돌아간다.
이와 같이 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋(Commit)이라 하고, 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백(Rollback)이라 한다.
ACID
트랜잭션은 ACID라는 4가지 원칙을 보장해야한다.
- Atomicity - 원자성
- 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다.
- Consistency - 일관성
- 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다.
- 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
- Isolation - 격리성
- 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다.
- 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.
- 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolation level)을 선택할 수 있다.
- Durability - 지속성
- 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다.
- 만약, 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
참고
트랜잭션 격리 수준 -Isolation level
- READ UNCOMMITED(커밋되지 않은 읽기)
- READ COMMITED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
일반적으로 데이터베이스에서는 READ COMMITED(커밋된 읽기), REPEATABLE READ(반복 가능한 읽기)를 많이 채택한다.
'DataBase' 카테고리의 다른 글
MySQL 문법 기초(2) (1) | 2023.07.08 |
---|---|
MySQL 문법 기초(1) (0) | 2023.07.07 |