Transaction, 트랜잭션이란?
왜 사용하는가?
트랜잭션의 특징
트랜잭션의 독립성
트랜잭션의 상태
데이터 베이스의 상태를 변경시키기 위해 수행하는 작업 단위라고 한다. Commit(커밋) 또는 RollBack(롤백)을 사용해 트랜잭션 단위로 작업을 확정하거나, 트랜잭션 내의 모든 DML 명령어를 취소할 수 있다.
즉, 작업 확정/최소의 단위가 되는 것이 트랜잭션이라고 한다.
간단하게 SELCET, INSERT, DELETE, UPDATE 의 질의어(SQL)를 이용하여 데이터 베이스에 접근하는 것을 의미
하지만 작업의 단위는 질의어 한문장이 아니다.
작업의 단위는 정하는 기준에 따라 달라진다.
| 명령어 | 의미 |
|---|---|
| COMMIT; | 트랜잭션 내의 작업 확정 (해당 트랜잭션 종료, 완결) |
| ROLLBACK; | 트랜잭션 내의 모든 명령어 취소 (해당 트랜잭션 내의 작업이 삭제) |
| 마지막 커밋 직후의 상태로 복귀 |
A -----> B에게 2천원을 갚아야하는데,
A는 송금을 진행했지만 오류가 생겨 B는 받지 못 하였다. 이런 경우 생돈 2천원만 날아갔다.
이런 경우에 트랜잭션을 사용하면 롤백해서 다시 돌리고 새로 진행하게 된다.
이렇게 어떤 작업이 동시에 (사실은 순차적이지만 결과는 동시에 일어난다) 일어나야 할때, 사용한다.
다른 이유가 더 있으면 추가할 예정
트랜잭션은 "ACID"라고 하는 원자성, 일관성, 격리성, 지속성을 보장해야한다.
| 특징 | 설명 |
|---|---|
| 원자성(Atomicity) | 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야한다. |
| 일관성(Consistency) | 모든 트랜잭션은 일관성 있는 데이터 베이스 상태를 유지해야 한다. 예를들어 데이터 베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. |
| 독립성(Isolation) | 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 독립적이여야한다. 즉, 서로 간섭이 불가능하여 동시에 같은 데이터를 수정하지 못 하도록 해야 한다. |
| 지속성(Durability) | 트랜잭션을 성공적으로 끝내면 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야한다. |
트랜잭션의 독립성은 '실행 중인 트랜잭션의 중간 결과를 다른 트랜잭션이 접근할 수 없다.'이다.(격리성이라고 부르기도 함)
여기서 무조건 접근할 수 없다는 것이 아니라 접근 레벨이 있으며 DB에 따라 설정이 가능하다.
이런 독립성은 강하게 혹은 약하게 처리가 가능하다.
Read UnCommitted
Read Committed
Repeatable Read
Serializable Read
Dirty Read
Non-Repeatable Read
Phantom Read
한 트랜잭션 내에서 같은 쿼리를 두 번 수정했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.
Phantom Read와 Non-Repeatable Read의 차이는 Phantom Read는 여러개의 요청에 대해 데이터 값이 변경되고, Non-Repeatable은 1개의 Row씩 데이터 값이 변경된다.


트랜잭션은 논리적으로 5가지에 상태에 있을 수 있다고 한다.
| 상태 | 설명 |
|---|---|
| Active | 트랜잭션이 현재 실행 중인 상태 |
| Failed | 트랜잭션이 실행되다 오류가 발생해서 중단된 상태 |
| Aborted | 트랜잭션이 비정상 종료되어 Rollback이 수행된 상태 |
| Partially Committed | 트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태 |
| Committed | 트랜잭션이 성공적으로 종료되어 Commit연산을 실행한 후의 상태 |