트랜잭션5 예외와 트랜잭션 커밋/롤백 예외가 발생했는데, 내부에서 예외를 처리 못 하고 트랜잭션 범위 밖으로 예외를 던지면 어떻게 될까? 예외 발생 시 스프링 트랜잭션 AOP는 예외 종류에 따라 트랜잭션을 커밋하거나 롤백한다. 언체크 예외인 RuntimeException, Error와 그 하위 예외가 발생하면 트랜잭션을 롤백한다. 체크 예외인 Exception과 그 하위 예외가 발생하면 트랜잭션을 커밋한다. 물론 정상 응답(리턴)하면 트랜잭션을 커밋한다. 테스트 코드 @SpringBootTest public class RollbackTest { @Autowired RollbackService rollbackService; @Test void runtimeException() { assertThatThrownBy(() -> rollbackSe.. Tech/Spring 2024. 1. 3. @Transactional의 타입 : readOnly readOnly 트랜잭션은 기본적으로 읽기 쓰기 모두 가능한 트랜잭션이 생성된다. readOnly=true 옵션을 사용하면 읽기 전용 트랜잭션이 생성된다. 이 경우 등록, 수정, 삭제가 안되고 읽기 기능만 작동한다. readOnly 옵션을 사용하면 읽기에서 다양한 최적화가 발생할 수 있다. [readOnly 옵션이 적용되는 3곳] 프레임워크 JdbcTemplate은 읽기 전용 트랜잭션 안에서 변경 기능을 실행하면 예외를 던진다. JPA(하이버네이트)는 읽기 전용 트랜잭션의 경우 커밋 시점에 플러시를 호출하지 않는다. 읽기 전용이니 변경에 사용되는 플러시를 호출할 필요가 없다. 추가로 변경이 필요 없으니 변경 감지를 위한 스냅샷 객체도 생성하지 않는다. 이렇게 JPA에서는 다양한 최적화가 발생한다. JDB.. Tech/Spring 2023. 12. 27. 스프링 트랜잭션 이해 스프링 트랜잭션 추상화 각각의 데이터 접근 기술들은 트랜잭션을 처리하는 방식에 차이가 있다. JDBC 기술과 JPA 기술은 트랜잭션을 사용하는 코드 자체가 다르다 따라서 JDBC 기술을 사용하다가 JPA 기술로 변경하게 되면 트랜잭션을 사용하는 코드도 모두 함께 변경해야 한다. 스프링은 이런 문제를 해결하기 위해 트랜잭션 추상화를 제공한다. 트랜잭션을 사용하는 입장에서는 스프링 트랜잭션 추상화를 통해 둘을 동일한 방식으로 사용할 수 있게 되는 것이다. 스프링은 PlatformTransactionManager라는 인터페이스를 통해 트랜잭션을 추상화한다. PlatformTransactionManager 인터페이스 트랜잭션은 트랜잭션 시작(획득), 커밋, 롤백으로 단순하게 추상화 할 수 있다. 스프링은 트랜잭.. Tech/Spring 2023. 12. 25. SpringBootTest : @Transactional 스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 애노테이션 하나로 깔끔하게 해결해준다. 다시 테스트를 실행해도 실패되지 않고 모두 성공한다 마치 롤백되는 것처럼!! @Transactional 원리 스프링이 제공하는 @Transactional 애노테이션은 로직이 성공적으로 수행되면 커밋되도록 동작한다. 그런데 @Transactioanl 애노테이션을 테스트에서 사용하면 아주 특별하게 동작한다. 테스트에서는 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버린다. @Transactional이 적용된 테스트 동작 방식 테스트에 @Transactional 애노테이션이 테스트 메서드나 클래스에 있으면 먼저 트랜잭션을 시작한.. Tech/Spring 2023. 12. 15. DB 트랜잭션 실습: 계좌이체 set autocommit false; update member set money=10000 - 2000 where member_id = 'memberA'; update member set money=10000 + 2000 where member_id = 'memberB'; 문제 발생 계좌 이체 실패 상황 memberB는 12000원이 되어야 함 커밋 후 롤백 위와 동일한 문제 발생 롤백을 통해 계좌이체 실행 전으로 복구됨 정리 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. 성공하면 한번에 반영, 중간에 실패해도 마치 하나의 작업을 되돌리는 것처럼 간단히 되돌릴 수 있다. 오토 커밋: 쿼리를 하나 실행할 때마다 바로바로 커밋되어 버리기 때문에 계.. CS/DB 2023. 11. 16. 이전 1 다음 728x90 반응형