Spring의 트랜젝션
기본적으로 XML을 사용해서 선언하는 방식과 애노테이션을 활용하는 방식
XML의 경우
별도의 transaction-context.xml 파일을 이용해 XML로 작성해서 처리
애노테이션의 경우
DAO 나 Mapper 등을 이용하는 xxxService 클래스에 애노테이션 처리
트랜잭션에 대한 설명
트랜잭션은 하나의 업무에 여러 개의 작은 업무들이 같이 묶여 있는 것을 의미한다.
트랜잭션의 기본 원칙 ACID
원자성(Atomicity) - 하나의 트랜잭션은 모두 하나의 단위로 처리돼야한다. 어떤 트랜잭션이 A와 B로 구성된다면, 항상 A, B 처리결과는 동일한 결과여야 한다. 즉 A 는 성공했지만 B는 실패할 경우 A, B는 원래 상태로 되돌려져야만 한다. 어떤 작업이 잘못되는 경우 모든 것은 다시 원점으로 되돌아가야만 한다.
일관성(Consistency) - 트랜잭션이 성공했다면 데이터베이스의 모든 데이터는 일관성을 유지해야한다. 트랜잭션으로 처리된 데이터와 일반 데이터 사이에는 전혀 차이가 없어야만 한다.
격리(Isolation) - 트랜잭션으로 처리되는 중간에 외부에서의 간섭은 없어야만 한다.
영속성(Durability) - 트랜잭션이 성공적으로 처리되면, 그 결과는 영속적으로 보관되어야 한다.
@Transactional 애노테이션
스프링에서는 트랜잭션을 처리하기 위해서 제공되는 @Transactional 애노테이션을 이용한다.
전파(Propagation) 속성
- PROPAGATION_MANDATORY = 작업은 반드시 특정한 트랜잭션이 존재한 상태에서만 가능
- PROPAGATION_NESTED = 기존에 트랜잭션이 있는 경우, 포함되어서 실행
- PROPAGATION_NAVER = 트랜잭션 상황에 실행되면 예외 발생
- PROPAGATIOIN_NOT_SUPPORTED = 트랜잭션이 있는 경우에는 트랜잭션이 끝날때까지 보류된후 실행
- PROPAGATION_REQUIRED = 트랜잭션이 있으면 그 상황에서 실행, 없으면 새로운 트랜젝션 실행(기본설정)
- PROPAGATION_REQUIRED_NEW = 대상은 자신만의 고유한 트랜잭션으로 실행
- PROPAGATION_SUPPORTS = 트랜잭션을 필요로하지 않으나, 트랜잭션 상황에 있다면 포함되서 실행
격리(Isolaction) 레벨
- DEFAULT = DB설정, 기본격리 수준(기본설정)
- SERIALIZABLE = 가장높은 격리, 성능 저하의 우려가 있음
- READ_UNCOMMINTED = 커밋되지 않은 데이터에 대한 읽기를 허용
- READ_COMMITED = 커밋된 데이터에 대한 읽기 허용
- REPEATEABLE_READ = 동일 필드에 대한 다중 접근시 모두 동일한 결과를 보장
Read-only 속성
- true 인경우 insert, update, delete 실행시 예외발생, 기본설정은 false
Rollback-for-예외
- 특정예외가 발생시 강제로 Rollback
No-rollback-for-예외
- 특정예외 발생시 Rollback 처리되지 않음
트랜잭션 매니저의 설정
root-context.xml의 처리
<bean id="transactionManager" class="org.srpingframework.jdbc.DatasourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:annotation-driven /> |
하나의 DataSource를 사용하는 경우에는 스프링에서 제공하는 DataSourceTransactionManager를 이용하는데, 이 때 필요한 DataSource를 주입받도록 한다.
<tx:annotation-driven />은 @Transactional 애노테이션을 이용한 트랜잭션의 관리가 가능하다
public void addMassage(MessageVo vo) throws Exception { messageDAO.create(vo); pointDAO.updatePoint(vo.getSender(), 10); } |
@Transactional 애노테이션은 인터페이스와 클래스 선언, 메소드 선언에서 사용할수 있는데 적용은 반대로 우선순위가 높다.
메소드에 선언한 @Transactional의 설정이 가장 우선되기 때문에 일반적인 경우라면 클래스나 인터페이스에 공통적인 규칙을 선언하고 메소드에는 특별한 설정을 추가하는 경우가 많다.
따라서 인터페이스에는 가장 기준이 되는 @Transactional 과 같은 설정을 지정하고, 클래스나 메소드에 필요한 애노테이션을 처리하는 것이 좋다.
'JAVA > Spring' 카테고리의 다른 글
Spring Interceptor HttpSession Login (0) | 2017.12.13 |
---|---|
Spring Interceptor (0) | 2017.12.13 |
Spring AOP (0) | 2017.11.21 |
RestController (0) | 2017.11.20 |
예외처리 기본 (0) | 2017.11.20 |