[데이터베이스] 트랜잭션 개념 및 특징
트랜잭션이란?
트랜잭션(Transaction)이란, “더 이상 분할이 불가능한 업무 처리의 단위”를 의미한다.
하나의 작업을 위해 분할될 수 없는 명령들의 모음, 즉 수행되어야 할 일련의 연산모음을 의미한다.
예제를 통해 이해하는 트랜잭션 개념
민수는 현재 100만원을 가지고 있고 철수는 200만 원을 가지고 있다고 가정한다.
민수가 철수에게 30만원을 이체하려고 한다.
그럼 수행되어야할 SQL문을 보면 다음과 같이 된다.
이 과정에서 1번과 2번 SQL문이 정상적으로 작동해야 ‘이체’라는 개념이 성립한다.
1번 실패, 2번 성공 경우 → 민수 잔액 : 100만 원, 철수 잔액 : 230만 원 → 출처 없는 돈이 생겨버림
1번 성공, 2번 실패 경우 → 민수 잔액 : 70만원, 철수 잔액 : 200만 원 → 사라진 민수의 돈..
-- 1) 민수 계좌에서 300,000원 인출
UPDATE account SET balance = balance - 300000 WHERE id = "민수";
-- 2) 철수 계좌에서 300,000원 입금
UPDATE account SET balance = balnce + 300000 WHERE id = "철수";
따라서 둘 다 정상 처리되어야만 성공하는 단일 작업인 것이다.
이것이 트랜잭션이다
- 단일한 논리적인 작업 단위
- 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나누어질 수 없게 만든 것이 트랜잭션이다.
- 트랜잭션의 SQL문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.
위에서 알아본 트랜잭션을 SQL문으로 나타내보면, 다음과 같이 된다.
START TRANSACTION; -- 트랜잭션 시작
-- 민수 계좌에서 300,000원 인출
UPDATE account SET balance = balance - 300000 WHERE id = "민수";
-- 철수 계좌에서 300,000원 입금
UPDATE account SET balance = balnce + 300000 WHERE id = "철수";
COMMIT; -- 지금까지 작업한 내용을 DB에 영구적으로 저장 및 트랜잭션 종료
만약 중간에 어떤 이유로 트랜잭션을 취소 하고 싶다면, 다음과 같다.
START TRANSACTION; -- 트랜잭션 시작
-- 민수 계좌에서 300,000원 인출
UPDATE account SET balance = balance - 300000 WHERE id = "민수";
/*
어떤 이유로 취소하고 싶음
*/
ROLLBACK; -- 지금까지 작업들을 모두 취소하고 트랜잭션 이전 상태로 되돌림 및 트랜잭션 종료
이처럼 안정성을 확보하기 위한 방법이 트랜잭션인 것이다.
따라서 DB에서 테이블의 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신 및 삭제하는 도중에 오류가 발생하면, 결과를 다시 반영하는 것이 아니라 모든 작업을 원상 복구한다.
처리 과정이 모두 성공하였을 때만 그 결과를 반영한다.
AUTOCOMMIT
- 각각의 SQL문을 자동으로 트랜잭션 처리 해주는 개념
- SQL문이 성공적으로 실행하면 자동으로 커밋
- 실행 중에 문제가 있었다면 알아서 롤백
- MySQL에서는 기본적으로 autocommit이 활성화되어있음
- START TRANSACTION 실행과 동시에 autocommit은 비활성화됨
- COMMIT / ROLLBACK과 함께 트랜잭션이 종료되면 원래 autocommit 상태로 돌아감
일반적인 트랜잭션 사용 패턴
1. 트랜잭션 시작
2. 데이터를 읽거나 쓰는 등의 SQL문들을 포함해서 로직 수행
3-1. 문제없으면 커밋
3-2. 문제 생기면 롤백
ACID
Atomicity - 원자성
Consistency - 일관성
Isolation - 독립성
Durability - 영구성
의 특징을 가진다.
Atomicity
“모두 성공하거나, 모두 실패하거나”
트랜잭션이 DB에 모두 반영이 되거나, 아니면 전혀 반영이 되지 않아야 한다는 것이다.
트랜잭션은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부 SQL문들이 모두 성공해야 한다.
중간에 SQL문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 롤백한다.
만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동했을 시 원인을 찾기가 매우 힘들어질 것이다.
Consistency
트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다.
시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.
Isolation
둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다.
하나의 특정 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.
Durability
트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다.
트랜잭션 상태
- Active - 활성 : 트랜잭션이 정상적으로 실행 중인 상태
- Partially Committed - 부분 완료: 트랜잭션의 마지막까지 실행되었으나 커밋이 실행되기 직전의 상태
- Committed - 완료 : 트랜잭션이 성공적으로 종료되어 커밋을 실행한 후의 상태
- Failed - 실패: 트랜잭션 실행에 오류가 발생하여 중단된 상태
- Aborted - 철회 : 트랜잭션이 비정상적으로 종료되어 롤백을 수행한 상태
참고자료
1) COMMIT과 ROLLBACK
* **COMMIT** * 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어이다. * 트랜젝션의 처리 과정을 데이터베이스에 반영하기 위해서, **변경된 내용을 모…
wikidocs.net
https://akasai.space/db/about_acid/
트랜잭션과 ACID | devlog.akasai
트랜잭션이란? 여러 작업을 하나로 묶은 작업수행의 논리적 단위입니다. 한 개 이상의 작업으로 구성되며 한 트랜잭션은 모두 실행되거나, 실행되지 않습니다. 트랜잭션의 상태 한 트랜잭션 플
akasai.space