본문 바로가기

JAVA/Spring

Spring Transaction

반응형

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