프레임워크 Transaction

robin Han·2023년 5월 8일
0

Spring

목록 보기
10/13

트랜잭션 원칙 ACID

Atomicity
Consistency
Isolation
Durability

트랜잭션의 경계

프리젠테이션층 과 비즈니스 층 사이에 트랜잭션을 실행
AOP로 서비스에 트랜잭셔 처리를 어드바이스를 적용함 서브시 내부를 수정하지 않고 트랜잭션을 처리

트랜잭션 처리는 트랜잭션 관리자와 트랜잭션 어드바이스 사용

트랜잭션 관리자

  • PlatformTransationManager : 해당 인터페이스를 사용해서 알맞는 관리자, mybatis, hybernate 트랜잭션 매니저 적합한 선택을 해줌. 따라서 전체 트랜잭션 매니저 관리는 PlatformTransationmanager 사용. 다른 데이터베이스 프레임워크를 사용해도 공통적으로 사용할수있게 해준다 .
----------------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

트랜잭션 구현 클래스

@Transactional Propagation

2개이상의 트랜잭션이 작동할때 기존 트랜잭션에 참요하는 방법을 결정
Default: @Transactional(propagation = Propagation.Required)

@Transactional Isolation

여러개의 트랜잭션이 동시 실행될때 어떻게 데이터 무결성을 보장할지

Transaction XML 설정

-----------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>

Transaction Annotation

--------------application-context.xml
	<tx:annotation-driven transaction-manager="transactionManager"/> 

@Transactional 우선 순위

  • 메서드의 @Transactional 우선수위가 가장 높다
  • 클래스의 @Transactional ~
  • 인터페이스의 @Transactional 우선순위가 가장 낮다
--------- 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);
   }

Transaction Java

-----------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);
}

0개의 댓글