예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다.
만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다.
이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다.
이런 거래의 최소 단위를 트랜잭션이라고 한다.
트랜잭션 처리가 정상적으로 완료된 경우 커밋(COMMIT)을 하고, 오류가 발생할 경우 원래 상태로 롤백(ROLLBACK)을 한다.
데이터 베이스 기능 중, 트랜잭션을 조작하는 기능은 데이터베이스 완전성(integrity) 유지를 확신하게 된다.
완전성 : 데이터는 결측치, 오류를 가지지 않아야 함.
데이터베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야한다.
각각을 살펴보자
Atomicity - 원자성
하나의 트랜잭션은 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다. 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야한다.
ALL or NOTHING 의 개념으로 작업 단위를 일부분만 실행하지 않는다는 것을 의미한다.
Consistency - 일관성
트랜잭션이 완료된 결과값이 일관적인 DB 상태를 유지하는 것을 말한다.
시스템이 가지고 있는 고정요소는 수행 전과 후의 상태가 같아야 하며 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것으로
트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 엡데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라,
처음 트랜잭션을 진행하기 위해 참조한 데이터 베이스로 진행된다.
트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들뿐만 아니라,
A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 한다는 사항과 같은 비명시적인 일관성 조건들도 있다.
Isolation - 고립성
하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다.
즉, 트랜잭션 끼리는 서로를 간섭할 수 없다.
트랜잭션이 실행되는 도중에 변경한 데이터는 해당 트랜잭션이 완료될 때까지 다른 트랜잭션에서 참조하지 못하게 하는 특성이다.
Durability - 지속성
트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.
지속성은 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것이다.
즉, 정상적으로 완료 혹은 부분 완료된 데이터는 DBMS 가 책임지고 데이터베이스에 기록하는 성질이 지속성이며 영속성이라고 표현하기도 한다.
@Transactional
을 사용하는 법어노테이션을 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다.
@Transactional
public void addUser(UserDto userDto) throws Exception {
//로직 구현
}