본문 바로가기
dev/Spring

[Spring] @Transactional-1

by dev_Step 2022. 7. 12.

Presentation Layer

  >> CONTROLLER : 사용자의 요청을 받는 부분

Businees Layer

  >> SERVICE : 비즈니스 로직을 처리할 계층

  >> Tx 처리를 해야하는 부분

Persistence Layer

  >> DAO : CRUD가 이뤄지는 계층

 

 

>> TransactionManager란?

 - DAO의 각 매서드는 개별 Connection을 사용 ==> 1개의 Connection을 사용하도록 해야 Rollback하여 되돌릴 수 있음

  ==>> DAO에서 Connection을  얻거나 반환할떄 DataSourceUtils를 사용해야 한다.

  ===> Connection con = DataSourceUtils.getConnection(ds);

  ===> DataSourceUtils.releaseConnection(con, ds);

 

 

>> TransactionManager로 Transaction적용하기

>> TransactionManger가 하나의 Tx으로 진행되도록 한다.

public void insertWithTx() throws Exception{
  PlatformTransactionManager tm = new DataSourceTranscationManager(ds);
  TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());
   //Tx 시작
  try{
     a1Dao.insert(1,100);
     a1Dao.insert(2,200);
     tm.commit(status);   -- Tx 끝  //  성공
   }catch(Exception exception){
    tm.rollback();            -- Tx 끝  //  실패
   }
}

 >> TransactionManger를 Bean으로 등록하는 방법

 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotaion-driven/>  <--- @Transactional 이라는 Annotaion을 사용할수있음

 

 

>> AOP를 이용한 핵심기능과 부가 기능 분리

  핵심기능 : insert()

   그가기능 : 그 외

 

>>    

    @Transactional ==>을 붙여주면 위와같이 실행된다.

     a1Dao.insert(1,100);

     a1Dao.insert(2,200);

 

 

============================================================================================

 

 

 

 

 

>> TransactionManager를 통해서 Tx는 하나로 묶어주기떄문에

>>  insert시에 Primary Key로 인해 첫번쨰 insert는 성공하지만 두번쨰 insert는 실패하게된다

>> 실패시에는 첫번째 성공한 insert또한 rollback되어 처음상태로 돌아간다.

 

========================================================================================

실습 간 계속 잘 진행되었는데 

DataSourceTransactionManager 를 <Bean> 등록한 후 에러가 아래와 같은 에러가 계속 발생하여 확인해 보니

Spring version과 Spring-jdbc version이 달라서 발생한 일이였다.

caused by: org.springframework.beans.factory.beancreationexception:
error creating bean with name 'datasource' defined in url [file:src/main/webapp/web-inf/spring/root-context.xml]:
initialization of bean failed; nested exception is java.lang.nosuchmethoderror:
'boolean org.springframework.core.annotation.annotationutils.iscandidateclass(java.lang.class, java.lang.class)'

 

 

'dev > Spring' 카테고리의 다른 글

[Spring] Mybatis -1 (2방법)  (0) 2022.07.12
[Spring] @Transactional-2  (0) 2022.07.12
[Spring] AOP-2  (0) 2022.07.12
[Spring] Transaction, Commit, Rollback  (0) 2022.07.06
[Spring] Di 따라하기 4  (0) 2022.06.22