트랜잭션은 네 가지의 특징을 가지고 있다.
DB 트랜잭션은 DB 시스템 또는 유사한 시스템에서의 상호작용 단위이다.
인터넷 쇼핑에서 상품을 구매할 때 내가 결제를 하려는 순간 다른 요청이 들어왔을 때 어떻게 될까?
이런 경우를 방지하려면
결제는 다른 사람과 독립적으로 이루어져야하고 과정중에 다른 연산이 끼어들 수 없다. 또한 오류가 생긴 경우 연산을 취소, 롤백하고 성공할 경우 커밋해야한다.
@Transactional 어노테이션을 클래스나 메서드에 붙여줄 경우, 해당 범위 내 메서드가 트랜잭션이 되도록 보장해준다. 이를 선언적 트랜잭션이라고 말한다
@Transactional 어노테이션이 클래스나 메서드에 붙을 때 Sptring은 해당 메서드에 대한 프록시를 만든다. 프록시 패턴은 디자인 패턴 중 하나로, 어떤 코드를 감싸면서 추가적인 연산을 수행하도록 강제하는 방법이다.
트랜잭션의 경우, 트랜잭션과 시작과 연산 종료시의 커밋이 필요하므로 프록시를 생성해 해당 메서드의 앞뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.