트랜잭션이란?
"더이상 분할이 불가능한 업무처리의 단위"를 의미합니다.
하나의 작업을 위해 더이상 분할될 수 없는 명령들의 모음을 의미하며, 한꺼번에 수행되어야 할 일련의 연산모음을 의미합니다.
다음과 같은 상황이 있다고 가정해봅니다.
1. 친구들과 놀고 집에 온 민영이는 정산을 해야합니다.
유진이에게 3만원을 카카오페이를 사용하여 송금했습니다.
2. 그러나 내 통장에서는 3만원이 차감되었는데, 유진이 계좌에는 3만원이 입금되지 않았습니다.
위의 상황과 같이 만약 인출에는 성공했는데, 입금에 실패하면 치명적인 사고가 납니다.
따라서 이 두 과정은 동시에 성공하던지 동시에 실패해야 합니다.
이 과정을 동시에 묶는 방법이 바로 트랜잭션입니다.
START TRANSACTION
민영의 계좌로부터 인출
유진의 계좌로 입금
COMMIT
이와 같이,데이터 거래에 있어서 안전성을 확보하기 위한 방법이 트랜잭션입니다.
따라서 데이터베이스에서 테이블의 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면, 결과를 재반영하는 것이 아니라 모든 작업을 원상태로 복구하고, 처리과정이 모두 성공하였을때만 그 결과를 반영합니다.
MYSQL 트랜잭션
MySQL에서 트랜잭션은 데이터베이스의 상태를 바꾸는 일종의 작업 단위입니다.
INSERT,DELETE, UPDATE 등의 SQL 명령문을 통해 데이터 상태를 바꿀 때마다 내부적으로 자동 Commit을 실행하여 변경된 내역을 데이터베이스에 반영하는 것입니다.
이 때 작업단위는 질의어 한문장이 아니라
많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미합니다.
ex) 게시판
1) 민영이는 게시글을 작성하고 업로드버튼을 누릅니다.
2) 글 업로드에 성공하면 자동으로 게시판 리스트로 돌아갑니다.
3) 게시판에 자신의 글이 포함된 게시글들을 볼 수 있습니다.
위의 상황을 데이터베이스 작업으로 옮기면
- 사용자가 업로드 버튼을 눌렀을 시 INSERT문
- 게시판을 조회하는 SELECT문
위 상황에서의 작업 단위는 INSERT문과 SELECT 문을 합친 것입니다.
트랜잭션 특징(ACID)
트랜잭션의 특징은 크게 4가지로 구분됩니다.
| 원자성(Atomicity) | 트랜잭션이 데이터베이스에 모두 반영되거나, 모두 반영되지 않아야 합니다. |
| 일관성(Consistency) | 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야합니다. 트랜잭션이 진행되는 동안에 데이터베이스가 변경이 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행됩니다. |
| 독립성(Isolation) | 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없습니다. |
| 영구성(Durability) | 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 합니다. |
트랜잭션 상태

1. 활성(Active) : 트랜잭션이 정상적으로 실행중인 상태를 의미합니다.
- 트랜잭션이 시작되면, 해당 트랜잭션의 상태는 활동(Active)상태가 됩니다.
2. 작업 성공 시
2 - 1. 부분 완료(Partially Commited) : 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태입니다.
2 - 2. 완료(Committed) : 트랜잭션이 성공이 종료되어 Commit 연산을 실행한 후의 상태를 말합니다.
3. 작업 실패 시
3 - 1. 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태입니다.
3 - 2. 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태입니다.
트랜잭션 문법
명령어들은 MySQL에서 자동 Commit을 통해 쿼리 입력과 동시에 처리하여 데이터베이스에 반영됩니다.
START TRANSACTION;
select * from members;
UPDATE MEMBERS
SET
LastName = '영',
FirstName = '허민',
Address = '부천',
City = '경기도',
Country = '대한민국'
WHERE ID = 12;
select * from members;
COMMIT;
select * from members;


롤백
테이블에 데이터가 넣어졌음에도 rollback한 순간 예전 상태로 되돌아가는 것을 볼 수 있습니다.
START TRANSACTION;
INSERT INTO MEMBERS (LastName, FirstName, Address, City, Country)
VALUES ('길냥', '홍', '강북구', '서울', '대한민국');
select * from members;
ROLLBACK;
select * from members;

트랜잭션 예외
DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 트랜잭션의 rollback 대상이 아닙니다.
MYSQL 트랜잭션 전역 설정
MySQL에서는 기본으로 Auto commit이 ON으로 설정되어 있습니다.

-- 오토커밋 off
SET AUTOCOMMIT = 0;
-- 오토커밋 on
SET AUTOCOMMIT = 1;
-- 오토쿼리 설정 확인
select @@autocommit;
위의 명령어로 오토커밋을 껐다 킬 수 있습니다.