📌 트랜잭션
트랜잭션(Transaction)이란, 데이터베이스 상태를 변화시키는 작업의 단위
❔데이터베이스 상태 변화
SELECT * FROM TODOLIST;
INSERT INTO TODOLIST VALUES(1, 'TODO');
UPDATE TODOLIST SET TODO = 'TODO2' WHERE ID = 1;
DELETE FROM TODOLIST WHERE ID = 1;
질의문(SQL)을 이용하여 데이터베이스에 접근하여 상태 변화를 준다.
❗하나의 질의문을 트랜잭션이라고 하는 것이 아니다.
트랜잭션의 작업 단위라는 것은, 사람이 정해둔 기준에 따라 구분되어 정해진다.
EX)
- 사용자가 새로운 TO-DO를 작성한다.
- 새롭게 작성된 TO-DO가 포함된 TO-DO-LIST가 보여진다.
INSERT INTO TODOLIST VALUES(1, 'TODO');
SELECT * FROM TODOLIST;
위의 두 문장을 합쳐 작업 단위로 묶어 표현하면, 이를 하나의 트랜잭션이라고 하게 된다.
따라서, 하나의 작업 단위인 트랜잭션을 잘 설계하는 것이 중요하다.
📌 트랜잭션의 특징
❕원자성(Atomicity)
트랜잭션이 데이터베이스에 모두 반영되거나, 혹은 모두 반영되지 않도록 해야 한다.
❗우리가 정해둔 작업 단위별로 작업이 이루어지지 않을 경우,
- 기준이 흐트러진 상태이므로 오류를 해결하기 어려움
- 데이터 처리가 어떻게 진행되었는지 파악하기 어려움
따라서, 반드시 정해둔 작업 단위별로 진행되어야 한다.
그렇기 때문에, 데이터베이스에 모두 반영될 수 없다면, 모두 취소되도록 하는 것이 안전한 방법이자 이를 원자성이라 한다.
❕일관성(Consistency)
트랜잭션의 작업 처리 결과가 항상 일관되어야 한다.
❗이미 진행되고 있는 트랜잭션이 있는 경우, 데이터베이스에 변경이 생긴다면?
작업이 진행 중이었던 트랜잭션은 데이터베이스에 변경이 이루어지더라도, 기존에 참조해오던 데이터베이스를 기준으로 꾸준히 작업을 진행한다.
데이터베이스가 중간의 변경되더라도 일관성 있게 참조해오던 데이터를 처리하도록 한다.
❕독립성(Isolation)
둘 이상의 트랜잭션이 실행되고 있는 경우, 어떠한 트랜잭션이라도 다른 트랜잭션이 연산에 끼어들 수 없다.
해당 트랜잭션이 완료될 때까지, 어떠한 참조도 불가능하다.
❕지속성(Durability)
트랜잭션의 작업이 완료되었다면, 해당 결과는 영구적으로 데이터베이스에 반영되어야 한다.
📌Commit & RollBack
❕Commit
데이터베이스에 모두 반영되어 원자성이 지켜지고, 처리 결과가 일관된 경우.
하나의 작업 단위인 트랜잭션이 완전히 완료된 상태, 즉 작업의 완료를 알리기 위해 Commit한다.
수행된 트랜잭션이 로그에 저장되며, 트랜잭션의 종료를 의미한다.
❕Rollback
데이터베이스에 모두 반영되지 않아 원자성이 깨지는 경우,
원자성을 지키기 위해 부분적으로 연산이 진행된 트랜잭션을 취소하고 처음부터 실행하고자 RollBack한다.
비정상적으로 종료된 트랜잭션을 모두 취소시켜버리는 것을 의미한다.
+ CheckPoint : Rollback의 지점을 설정
EX )
A, B, C에게 10만원을 입금하는 상황 (하나의 트랜잭션)
- A, B에게 10만원 입금 성공
- C에게 입금 실패
다시 트랜잭션이 그대로 실행된다면, A와 B에게 입금이 또 되어서 총 20만원이 보내지게 된다.
모든 입금을 취소하는 Rollback이 필요하다.
무사히 입금이 완료된 경우엔, Commit
📌 트랜잭션의 상태
활동(Active) : 트랜잭션이 실행 중인, 작업 중인 상태
실패(Failed) : 트랜잭션 실행 중 오류로 인해 비정상적으로 중단된 상태
철회(Aborted) : 트랜잭션의 비정상적인 종료로 Rollback 연산을 수행한 상태
부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행되었으나 아직 Commit 연산이 실행되지 않은 직전의 상태
완료(Committed) : 트랜잭션이 성공적으로 수행되여 Commit 연산까지 실행된 상태
📌@Transactional
@Transactional
public void Method {
...
}
프레임워크에서 트랜잭션을 생성하여 메서드를 하나로 묶어서 실행하도록 한다. 예외 상황 발생 시, 모든 작업이 Rollback되도록 한다.
메서드뿐만 아니라, class 위에도 붙일 수 있다. class 내부에 있는 메서드들을 transaction화하게 된다.
- isolation : 데이터 허용 수준 설정
- DEFAULT
- READ_UNCOMMITTED
- READ_COMMITTED
- REPEATABLE_READ
- SERIALIZABLE
- propagation : 다른 트랜잭션 호출 시 방법 설정
- readOnly : 읽기 전용 여부
- rollbackFor : 특정 예외 상황 시, Rollback
- timeout : 작업 수행 시간 설정
[Java]@Transactional Annotation 알고 쓰자
[Spring] @Transactional 어노테이션