[개념]_@Transactional 트랜잭션 처리

728x90

트랜잭션 처리

-트랜잭션 : 여러 쿼리를 논리적으로 하나의 작업으로 묶어준다.

- 묶인 쿼리 중 하나라도 실패하면 전체 쿼리 실패로 간주 -> ’롤백처리

            1) 롤백 : 트랜잭션의 모든 쿼리 실패 시, 실행 취소 후 DB 기존 상태로 복원

            2) 커밋 : 트랜잭션의 모든 쿼리 성공 시, 결과를 실제 DB에 반영하는 것

ex) 은행에서 돈 입출력 시 입금자의 돈이 빠져나가면, 상대 계좌에 돈이 입금되어야 하는데, 트랜잭션의 영속성이 없다면 입금자는 돈이 빠져나갔는데도 상대는 돈을 입금받지 못하게 됨


- 데이터 일관성을 위해 연관된 데이터 작업 시, 하나의 작업 단위로 묶어서 데이터 처리를 하는 것.
-스프링이 제공하는 트랜잭션 기능 사용 시, 중복 없는 간결한 트랜잭션 범위 지정 O

 

트랜잭션 사용 위한 설정

   ① xml 설정 파일

1) 트랜잭션 활성화 설정

<aop:aspectj-autoproxy></aop:aspec서-autoproxy>

2) PlatformTransactionManager 인터페이스를 빈 객체로 등록

<bean id = “transactionManager”
   class=“orog.springframework.jdbc.datasource.DataSourceTransactionManager”>
      <property name=“dataSource” ref=“dataSource”></property>
</bean>

3) 트랜잭션 @ 애노테이션으로 사용할 수 있게 태그 등록

<tx:annotation-driven> 태그

4) tx 관련 schema xml 설정 추가


   Java 설정 파일

1) 트랜잭션 활성화 설정

- 자바 설정 파일에 @EnableTransactionManagement 애노테이션 붙임

- 스프링은 @Transactional 적용된 빈 객체를 찾아서 알맞은 프록시 객체를 생성함

   이 프록시 객체는 @Transactional 메소드 호출 시, PlatformTransactionManager를 사용해서 트랜잭션을 시작함

2) PlatformTransactionManager 인터페이스를 빈 객체로 설정

- 동일한 방식으로 트랜잭션 처리를 위한 인터페이스


@Transactional 애노테이션

트랜잭션 처리를 위한 설정을 모두 완료하면, 트랜잭션 범위에서 실행하고 싶은 스프링 빈 객체 속 메소드에 @Transactional을 붙이면 된다.

<처리 우선순위>
메소드의 @Transactional   >>   클래스의 @Transactional   >>   인터페이스의 @Transactional

트랜잭션과 프록시 객체

스프링은 AOP를 이용하여 트랜잭션을 처리한다.
(내부적으로 proxy 객체가 생성되며 이 객체를 통해 트랜잭션이 실질적으로 처리됨)
스프링은 @Transactional 적용 빈 객체에 알맞은 프록시 객체를 생성하고, 프록시 객체는 @Transactional 붙은 메소드 호출하여 트랜잭션 시작함 -> 성공 시 커밋처리 실패 시 롤백 처리함

-JdbcTemplate 함수 호출 시 발생하는 에러의 경우, @Transactional 지정되어있다면 자동 롤백 처리됨
    cf. 일반 JDBC 함수 호출 시 익셉션은 롤백 처리 불가능
 
728x90