Atomicity
Consistency
Isolation
Durability
프리젠테이션층 과 비즈니스 층 사이에 트랜잭션을 실행
AOP로 서비스에 트랜잭셔 처리를 어드바이스를 적용함 서브시 내부를 수정하지 않고 트랜잭션을 처리
트랜잭션 처리는 트랜잭션 관리자와 트랜잭션 어드바이스 사용
----------------application-context.xml
트랜잭션 관리자 설정
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
트랜잭션 정의 정보
전파/Propagation : 기존 트랜잭션이 있는 상태일때 새로운 트랜잭션을 별도로 생성하거나 포함시키거나, 못만들게하는 설정
독립성/Isolation : 트랜잭션 처리중에 다른 트랜잭션이 연산 작업에 끼어들지 못하게 보장, 해당 데이터 사용 못하게 ,해당 level을 설정해줄수있다.
Rollback : 롤백 예외
Commit : 커밋 예외
Read-only : 처리를 읽기 전용으로 설정
timeout : 트랜잭션이 취소되는 만료 시간
Pointcut
2개이상의 트랜잭션이 작동할때 기존 트랜잭션에 참요하는 방법을 결정
Default: @Transactional(propagation = Propagation.Required)
여러개의 트랜잭션이 동시 실행될때 어떻게 데이터 무결성을 보장할지
-----------application-context.xml
---------------------------------------------------------------------------
어드바이져 설정
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"
propagation="REQUIRED"
isolation="READ_COMMITTED"
timeout = "10"
/>
</tx:attributes>
</tx:advice>
---------------------------------------------------------------------------\
AOP 설정하여 트랜잭션 적용
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* updateMemberList(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
--------------application-context.xml
<tx:annotation-driven transaction-manager="transactionManager"/>
--------- MemeberServiceIMPL.java
@Transactional ( propagtaion = Propagation.REQUIRED, isolation=Isolation.READ_COMMITED, timeout=10)
public void updateMemberList(StudentVO student1, StudentVO student2) throws Exception{
memberDAO.update(student1);
memberDAO.update(student2);
}
-----------JavaConfig.xml
@Configuration
@EnaleTransactionManagement
@ComponentsScan
@Bean
public DataSourceTransationManager transactionManager(){
return new DataSourceTransactionManager(datasource());
}
@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource, ApplicationContext applicationContext) throws Exception {
// dataSource, applicationContext @Bean 메서드를 인수를 통해 객체 취득 = @Autowired 설정 의미
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory .setDataSource(dataSource);
sqlSessionFactory .setConfigLocation(applicationContext.getResource("classpath:/mybatis-config.xml"));
sqlSessionFactory .setMapperLocations(applicationContext.getResources("classpath:mappers/*Mapper.xml");
return (SqlSessionFactory) sqlSessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) { // sqlSessionFactory @Bean 메서드를 인수를 통해 객체 취득 = @Autowired 설정 의미
return new SqlSessionTemplate(sqlSessionFactory);
}