정의
데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이자 한번에 모두 수행되어야하는 일련의 연산
상태를 변화 == SQL 질의어(INSERT, UPDATE, DELETE ... )를 통해 DB에 접근
트랜잭션 성질 (ACID)
- Atomicity(원자성): 트랜잭션 내 연산은 모두 반영되든지(
commit
) 아예 하나도 반영되지 않아야한다(rollback
). - Consistency(일관성): 실행이 성공적으로 완료되면 언제나 일관성있는 데이터베이스 상태를 유지해야한다.
- Isolation(독립성): 둘 이상의 트랜잭션이 병행 수행될 때, 서로의 연산에 끼어들거나 영향을 주면 안된다.
- Durability(영속성): 한 번 트랜잭션이 성공적으로 완료되면 해당 결과가 영구적으로 저장되어야한다.
Consistency는 트랜잭션의 일관성을 보장, Durability는 트랜잭션의 결과가 영구적으로 저장되고 시스템 장애에도 안전하게 유지되는 것
연산 및 상태
commit: 하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산
rollback: 트랜잭션 처리가 비정상적으로 수행되어 트랜잭션 원자성이 깨진 경우, 트랜잭션 내 연산을 모두 취소하고 트랜잭션을 수행하기 전 상태로 되돌려놓는 연산
- Active(활동): 트랜잭션 실행 중인 상태
- Failed(실패): 트랜잭션 실행 중 오류가 발생해 중단된 상태
- Aborted(철회): 트랜잭션이 비정상적으로 처리되어 rollback 연산을 수행한 상태
- Partially Committed(부분 완료): 트랜잭션 마지막 연산까지 정상적으로 처리되었지만 아직 commit은 하지 않은 상태
- Committed(완료): 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
사용 예제
MySQL
-- 트랜잭션 시작
START TRANSACTION;
-- 예제를 위한 테이블 생성
CREATE TABLE account (
id INT PRIMARY KEY,
balance DECIMAL(10,2)
);
CREATE TABLE transaction_log (
id INT PRIMARY KEY,
account_id INT,
amount DECIMAL(10,2),
timestamp TIMESTAMP
);
-- 트랜잭션 내에서 에러 발생 시
BEGIN
-- 사용자 계좌에 돈을 입금하는 SQL 문장
UPDATE account SET balance = balance + 1000 WHERE id = 1;
-- 트랜잭션 로그에 입금 내역을 기록하는 SQL 문장
INSERT INTO transaction_log (account_id, amount, timestamp) VALUES (1, 1000, NOW());
-- 여기서 의도적으로 에러 발생 (예: 나누기 0)
SELECT 1 / 0;
-- 에러가 발생하지 않았다면 트랜잭션 커밋
COMMIT;
-- 트랜잭션 롤백
ROLLBACK;
END;