복붙노트

[SPRING] 봄 / JTA / JPA DAO 통합 테스트가 롤백되지 않습니까?

SPRING

봄 / JTA / JPA DAO 통합 테스트가 롤백되지 않습니까?

DAO 통합 테스트는 테스트 도중 작성된 엔티티가 다음 테스트가 시작될 때 데이터베이스에 남아 있기 때문에 실패합니다. MySQL 5와 H2에서 똑같은 동작이 나타납니다.

테스트 클래스는 다음과 같이 주석이 붙습니다.

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { "/testPersist-applicationContext.xml" })

테스트 응용 프로그램 컨텍스트의 트랜잭션 bean 구성은 다음과 같습니다.

<tx:annotation-driven />

<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="atomikosTransactionManager" />
    <property name="userTransaction" ref="atomikosUserTransaction" />
</bean>

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
    <property name="forceShutdown" value="false" />
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <property name="transactionTimeout" value="300" />
</bean>

엔티티 관리자는 다음과 같이 구성됩니다.

<bean id="myappTestLocalEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myapp" />
    <property name="persistenceUnitPostProcessors">
        <bean                class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor">
        <property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" />
        </bean>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
            <property name="database" value="$DS{hibernate.database}" />
            <property name="databasePlatform" value="$DS{hibernate.dialect}" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
            </prop>
            <prop key="hibernate.format_sql">true"</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            </props>
    </property>
</bean>

<context:annotation-config />

로그 파일의 모든 내용은 괜찮아 보입니다 ... 나는 롤백에 관한 Spring의 메시지와 롤백에 관한 Atomikos의 메시지를 볼 수 있습니다. 하지만 솔직히 말해서, 로그는 너무 거대하고 복잡해서 쉽게 뭔가를 놓칠 수 있습니다 ...

그러나 삽입 된 테스트 데이터는 그대로 유지됩니다! 모든 단서?

해결법

  1. ==============================

    1.내 C3P0 JDBC 데이터 소스는 XA를 인식하지 못했기 때문에 트랜잭션에 참여하지 않았습니다. 왜 내가 로그 파일에서 오류나 경고를받지 못했는지 모르겠습니다. 그럼에도 불구하고 XA 인식 데이터 소스를 사용할 수없는 이유는 여기에서 매우 잘 설명됩니다. 데이터 소스는 XA를 지원할 필요는 없습니다 ... 단지 XA를 인식 할 수 있습니다.

    내 C3P0 JDBC 데이터 소스는 XA를 인식하지 못했기 때문에 트랜잭션에 참여하지 않았습니다. 왜 내가 로그 파일에서 오류나 경고를받지 못했는지 모르겠습니다. 그럼에도 불구하고 XA 인식 데이터 소스를 사용할 수없는 이유는 여기에서 매우 잘 설명됩니다. 데이터 소스는 XA를 지원할 필요는 없습니다 ... 단지 XA를 인식 할 수 있습니다.

    C3P0 데이터 소스를 다음 데이터 소스로 대체하면 문제가 해결됩니다.

    <bean id="myappJTANonXADataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
            <property name="uniqueResourceName" value="myappDatabase" />
            <property name="driverClassName" value="$DS{hibernate.connection.driver_class}" />
            <property name="url" value="$DS{hibernate.connection.url}" />
            <property name="user" value="$DS{hibernate.connection.username}" />
            <property name="password" value="$DS{hibernate.connection.password}" />
            <property name="maxPoolSize" value="20" />
            <property name="reapTimeout" value="300" />
    </bean>
    
  2. ==============================

    2.나는 당신이 세부 사항에있는 통나무를 통해서 갈 필요가있을 것이라는 점을 생각한다. 처음에 커밋을 실행 한 것을 제외하면 현재보고있는 롤백이 작동 중일 수 있습니다. 또한 자동 롤백을 나타내는 코드에서 아무것도 볼 수 없습니다. 그리고 그것은 각 테스트가 끝날 때 발생해야합니다. 시간 초과 기반 롤백에 의존하는 경우 시간 초과가 발생하기 전에 두 번째 테스트가 실행 중이므로 롤백되기 전에 데이터를 확인합니다.

    나는 당신이 세부 사항에있는 통나무를 통해서 갈 필요가있을 것이라는 점을 생각한다. 처음에 커밋을 실행 한 것을 제외하면 현재보고있는 롤백이 작동 중일 수 있습니다. 또한 자동 롤백을 나타내는 코드에서 아무것도 볼 수 없습니다. 그리고 그것은 각 테스트가 끝날 때 발생해야합니다. 시간 초과 기반 롤백에 의존하는 경우 시간 초과가 발생하기 전에 두 번째 테스트가 실행 중이므로 롤백되기 전에 데이터를 확인합니다.

    여기에 많은 옵션이 있습니다 :-)

  3. from https://stackoverflow.com/questions/3128111/spring-jta-jpa-dao-integration-test-doesnt-rollback by cc-by-sa and MIT license