Programmatic Transaction Management

개요

프로그램에서 직접 트랜잭션을 관리하고자 할 때 사용할 수 있는 방법에 대해서 설명하고자 한다. TransactionTemplate를 사용하는 방법Trnasaction Manager를 사용하는 방법 두가지가 있다.

설명

TransactionTemplate를 사용하는 방법

TransactionTemplate를 정의하고 callback 메소드 정의를 이용하여 Transaction 관리를 할 수 있도록 하는 방법이다.

Configuration

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
   <property name="transactionManager" ref="transactionManager"/>
</bean> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
</bean>
PROPERTIES 설 명
transactionManager 트랜잭션매니저
dataSource 데이타소스

위의 설정에서 transactionTemplate를 정의하고 property로 transactionManager을 정의한다. Templeate를 이용한 샘플은 아래와 같다.

Sample Source

@Test
public void testInsertCommit() throws Exception {
   transactionTemplate.execute(new TransactionCallbackWithoutResult() {
      public void doInTransactionWithoutResult(TransactionStatus status) {
         try {
            Role role = new Role();
            role.setRoleId("ROLE-001");
            role.setRoleName("ROLE-001");
            role.setRoleDesc(new Integer(1000));
            roleService.createRole(role);
         } catch (Exception e) {
            status.setRollbackOnly();
         }
      }
   });		
   Role retRole = roleService.findRole("ROLE-001");		
   assertEquals("roleName Compare OK",retRole.getRoleName(),"ROLE-001");
}

위의 예에서 transactionTemplate.execute에 TransactionCallbackWithoutResult를 정의하여 Transaction 관리를 하는 것을 확인할 수 있다.

사용 방법

Transaction Context에 의해 호출될 callback 메소드를 정의하고 이 메소드 내에 비즈니스 로직을 구현해주면 된다. 아래는 사용하는 방법의 예이다

   this.transactionTemplate.execute(new TransactionCallbackWithoutResult() {                
     public void doInTransactionWithoutResult(TransactionStatus status) {                    
     //... biz. logic ...       
     }});
 
   this.transactionTemplate.execute(new TransactionCallback() {                
     public Object doInTransaction(TransactionStatus status) {                    
     //... biz. logic ...       
     }});
   }

callback 메소드 doInTransactionWithoutResult()는 Result 값이 없을 경우에 사용하고, Result 값이 존재하는 경우에는 doInTransaction()으로 사용하도록 한다. 또한, callback 메소드 내에서 입력 인자인 TransactionStatus 객체의 setRollbackOnly() 메소드를 호출함으로써 해당 Transaction을 rollback할 수 있다.

Trnasaction Manager를 사용하는 방법

Transaction Manager를 직접 이용하는 방법이다.

Configuration

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
</bean>
PROPERTIES 설 명
dataSource 데이타소스

위의 설정에서 transactionManager을 정의한다.

Sample Source

@Test
public void testInsertRollback() throws Exception {
 
   int prevCommitCount = roleService.getCommitCount();
   int prevRollbackCount = roleService.getRollbackCount();
 
   DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
   txDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
   TransactionStatus txStatus = transactionManager.getTransaction(txDefinition);
 
   try {
      Role role = new Role();
      role.setRoleId(Thread.currentThread().getName() + "-roleId");
      role.setRoleName(Thread.currentThread().getName() + "-roleName");
      role.setRoleDesc(new Integer(1000));
      roleService.createRole(role);
      roleService.createRole(role);
      transactionManager.commit(txStatus);		
   } 
   catch (Exception e) {
      transactionManager.rollback(txStatus);
   } finally {
      assertEquals(prevCommitCount, roleService.getCommitCount());
      assertEquals(prevRollbackCount + 2, roleService.getRollbackCount());
   }
}

Transaction 서비스를 직접 얻어온 후에 위와 같이 try~catch 구문 내에서 Transaction 서비스를 이용하여, 적절히 begin, commit, rollback을 수행한다. 이 때, TransactionDefinition와 TransactionStatus 객체를 적절히 이용하면 된다.

잠고자료

 
egovframework/rte/psl/transaction/programmatic_transaction_management.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki