Whiteship's Note

9.6. Programmatic transaction management

Spring/Chapter 9 : 2007.04.16 11:14


선언적인 방법이 아니고 프로그래밍을 통해 트랜잭션 관리를 할 때 두 가지 경우가 있습니다.
1. TransactionTemplate 사용 할 경우
2. PlatformTransactionManager 를 구현한 클래스를 직접 사용 할 경우

9.6.1. Using the TransactionTemplate

private final TransactionTemplate transactionTemplate;

이렇게 멤버로 지정해 놓고 사용하면 됩니다. 먼저 트랜잭션의 속성을 설정하는 방법은 다음과 같습니다.

    public SimpleService(PlatformTransactionManager transactionManager) {
        Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
        this.transactionTemplate = new TransactionTemplate(transactionManager);

        // the transaction settings can be set here explicitly if so desired         this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
        this.transactionTemplate.setTimeout(30); // 30 seconds
        // and so forth...
    }

아니면 XML에서 설정하고 세터나 생성자 인젝션을 사용하면 되겠습니다.

<bean id="sharedTransactionTemplate"
      class="org.springframework.transaction.support.TransactionTemplate>
    <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
    <property name="timeout" value="30"/>
</bean>

트랜잭션 탬플릿을 사용해서 어떤 작업을 할 때는 다음과 같이 TransactionCallback 을 사용합니다. 탬플릿과 콜백에 대한 이해는 이 글을 참조하시길 초 강추 합니다.

1. 리턴 값이 있는 경우
public Object someServiceMethod() {
        return transactionTemplate.execute(new TransactionCallback() {

            // the code in this method executes in a transactional context
            public Object doInTransaction(TransactionStatus status) {
                updateOperation1();
                return resultOfUpdateOperation2();
            }
        });
    }

2. 리턴 값이 없는 경우
public void someServiceMethod2() {
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
   
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            updateOperation1();
            updateOperation2();
        }
    });
}

9.6.2. Using the PlatformTransactionManager

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setTransactionName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = txManager.getTransaction(def);
try {
    // execute your business logic here
}
catch (MyException ex) {
    txManager.rollback(status);
    throw ex;
}
txManager.commit(status);

TransactionDefinition, TransacionStatus, TransactionManager 객체를 직접 사용하여 트랜잭션 속성을 설정하고 롤백 또는 커밋을 하는 코드를 직접 작성하는 방법입니다. 이 세개의 객체들에 대한 관계는 without EJB의 트랜잭션 부분 242페이지에 잘 나와있습니다.

top

  1. Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.05.04 18:35 신고 PERM. MOD/DEL REPLY

    오타발견 def.setTransactionName("SomeTxName";); => def.setName("~~~";); 으로 바껴야 합니다.

Write a comment.




: 1 : ··· : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : ··· : 24 :