(All or Nothing)
Lock & Unlock
기법을 사용한다.Lock
을 걸어서 다른 트랜잭션이 접근하지 못하도록 한다.Unlock
하여 다른 트랜잭션이 처리될 수 있도록 허용한다.Commit
연산을 실행했다면 해당 데이터는 데이터베이스에 영원히 반영이 되어야 한다.🗒️ 데이터베이스 트랜잭션이란?
- 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위
- 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
@Transactional
을 붙이면, 트랜잭션 기능이 적용된 프록시 객체가 생성되며, 트랜잭션 성공 여부에 따라 Commit
또는 Rollback
작업이 이루어진다.@Transactional
어노테이션을 사용하기 위해선 PlatformTransactionManager
와 어노테이션 활성화 설정이 필요하다.@EnableTransactionManagement
설정이 되어 있어서 자동으로 사용할 수 있으며 사용을 원하는 클래스 또는 메서드에 @Transactional
어노테이션을 적용하면 된다.@Transactional
어노테이션이 있으면, 해당 타겟 빈을 상속받은 프록시 객체를 생성한다. private
메서드는 상속이 불가하기 때문에 어노테이션을 붙여도 동작하지 않는다.TransactionManager
의 최상위 인터페이스로, 환경에 맞는 클래스를 주입할 수 있도록 구성되어 있다.DataSourceTransactionManger
, JpaTransactionManager
등 필요한 정보를 Bean으로 등록하고 DI를 받아 사용한다. @Transactional
은 Spring AOP
를 통해 프록시 객체를 생성하여 사용된다.Target
객체를 직접 참조하지 않고, 프록시 객체를 사용하는 이유는, Aspect
클래스에서 제공하는 부가 기능을 사용하기 위해서이다. (기존 코드 변경 없이 접근 제어 및 부가 기능을 추가)Target
객체를 직접 참조하는 경우, 원하는 위치에서 직접 Aspect
클래스를 호출해야하기 때문에 유지보수가 어려워진다.JDK Proxy(Dynamic Proxy)
, CGLib
두 가지가 있다.Target
클래스가 인터페이스 구현체일 경우 생성되며, 구현 클래스가 아닌 인터페이스를 프록시 객체로 구현해서 코드에 끼워넣는 방식이다.Target
클래스를 프록시 객체로 생성하여 코드에 끼워넣는 방식이다.출처
[Spring] 트랜잭션과 @Transactional 총 정리
스프링 트랜잭션 동작 원리 (@Transactional, AOP)
[DB] 트랜잭션(transaction)이란?
[Spring] AOP와 JDK Dynamic Proxy, CGLIB