seam의 트랜잭션 관리

트랜잭션에는 기본적으로 JTA를 많이 사용할것이다.
persistence.xml의 정의를 보면 <jta-data-source>java:/kusaDatasource</jta-data-source> 와 같이 표시된다면 JTA를 사용한다.

그런데 seam에서는 기본적으로 JPA가 트랜잭션을 관리해준다. (CONTAINER관리)
경우에 따라서는 부분적으로 트랜잭션을 다루어야 할 필요가 있는데
그럴때는 JTA의 경우 UserTransaction을 사용한다.

JTA가 아닐경우는 EntityTransaction이나 HibernateTransaction이 있는데 위에서처럼 jta를 사용할때는 사용 불가능한 트랜잭션들이다.
따라서 여기서는 JTA를 기준으로 UserTransaction의 사용법을 메모한다.

먼저 components.xml 에 아래와 같이 정의한다.

<core:init debug=”false” jndi-pattern=”kusa-auth/#{ejbName}/local” transaction-management-enabled=”false” />

transaction-management-enabled의 설정이 중요하다.

그리고 Seam Component에서는

@TransactionManagement(TransactionManagementType.BEAN)

를 클래스에 선언한다.
즉, 트랜잭션을 Bean에서 관리하겠다는 뜻이다.

다음으로 트랜잭션이 필요한 메소드에는

@Transactional(TransactionPropagationType.REQUIRED)

를 메소드에 선언한다.
즉, 이 메소드는 트랜잭션을 Begin, Commit해 달라는 뜻이다.

하지만 메소드 내에서도 상세히 트랜잭션을 관리하고 싶을때가 있는데
그때는 메소드에 선언하는 아노테이션대신에 아래와 같이 코딩한다.

UserTransaction tx = (UserTransaction) org.jboss.seam.transaction.Transaction.instance();

이후에는 tx.begin(); 이나 tx.commit(); 을 이용하여 자유롭게 트랜잭션을 제어하면 된다.

This entry was posted in JBoss. Bookmark the permalink.