Transaction
은 상품, 서비스, 자산 등을 교환하기 위한 구매자와 판매자간 계약 또는 커뮤니케이션을 의미함트랜잭션은 데이터의 무결성이 지켜지기 위한 작업을 위해 특징을 가지고 있음
All or Nothing
의 연산을 수행 All or Nothing
을 구현하기 위한 연산으로 Commit
과 RollBack
이 존재 Rollback
@Transactional
어노테이션을 이용하여 트랜잭션 처리를 지원@Transactional
어노테이션을 사용가능, 이를 통해 선언전 트랜잭션이 적용 Commit
과 Rollback
을 지원
1. 실행할 로직에 대한 호출이 들어오면 Spring AOP Proxy가 이를 가로챔(Intercept)
2. Spring AOP Proxy 객체는 Transaction Advisor를 호출
3. Transaction Advisor는 Commit 또는 Rollback 등의 트랜잭션 처리를 수행
4. 트랜잭션 처리 외에 다른 부가 기능을 처리하기 위해 Custom Advisor를 호출하고 수행
5. Advisor에서 부가 기능 처리를 마치면 원래 호출했던 로직을 수행
6. Interceptor chain을 따라 caller에게 결과를 다시 전달
import org.springframework.transaction.annotation.Transactional;
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class UserService implements UserDetailsService {
private final UserRepository userRepository;
public void addUsers(List<User> userList) {
for (User user : userList) {
if (isEmailNotDuplicated(user.getEmail())) {
userRepository.save(user);
}
}
}
// 메소드
@Transactional
public void update(Long id, String password, Address address, String name) {
User user = userRepository.findById(id).orElse(null);
// 더티 체킹 (상태 변경 검사)
assert user != null;
user.updateUser(password, name, address);
}
}
import javax.persistence.*;
public class JpaMain {
public static void main(String[] args) {
// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager(); // 엔티티 매니저 생성
EntityTransaction tx = em.getTransaction(); // 트랜잭션 기능 획득
try {
tx.begin(); // 트랜잭션 시작
logic(em); // 비즈니스 로직
tx.commit(); // 트랜잭션 커밋
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //트랜잭션 롤백
} finally {
em.close(); //엔티티 매니저 종료
}
emf.close(); //엔티티 매니저 팩토리 종료
}
public static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("류원혁");
member.setAge(2);
// 등록
em.persist(member);
// 수정
member.setAge(28);
//삭제
em.remove(member);
}
}
PlatformTransactionManager
최상위 추상 인터페이스를 제공하기 때문에, 이를 이용하여 JDBC 구현체의 경우 DataSourceTxManager
를 이용하여 사용이 가능Commit
, Rollback
등 트랜잭션 작업을 수행해야하기 때문에, 이를 Spring Data JPA가 프록시 패턴을 사용하여 보완