2010-12-15 4 views
2

안녕하세요. 저는 XA 변환 관리 및 mysql에 대해 jsf, spring 3.0, hybernate + JPA 및 atomikos를 사용하여 응용 프로그램 구성을 완료했습니다. 여기에 모든 것이 잘 작동하지만, 예외가 throw 될 때 롤백이 롤백되어야하지만 실제로 발생하지는 않습니다! 여기에 작은 내 서비스 클래스에서 난 내는 죽을 살았어 jsfmanagedbean 사용하고 우리의 응용 프로그램 에 대한 흐름 내 transcation이트랜잭션 롤백은 있지만 레코드가 삽입됩니다.

TextileUIBean.java
패키지 com.textile.web을 시작입니다; public class TextileUIBean extends BaseManagedBean은 Serializable을 구현합니다. { public insertPaymentDetails() { PaymentDetails PaymentDetails = new PaymentDetails(); // 값은 하드 코딩되어 있습니다. 오직 두 개의 소유물 만 사용합니다. PaymentDetails.setCustomerName ("Manikandan"); PaymentDetails.setAmount (1000); getTextileManager(). insertPaymentDetails (PaymentDetails); } 공용 ITextileManager getTextileManager() { textileManager = (ITextileManager) getBean ("textileManager"); return textileManager; }

service class 


    package com.textile.web 
     public interface ITextileManager 
     { 
     public void insertPaymentDetails(PaymentDetails PaymentDetails); 
     } 
     package com.textile.web 
     public class TextileManager implements ITextileManager 
      { 
      ITextileBusiness TextileBusiness ; 

      public void setTextileBusiness(ITextileBusiness textileBusiness) { 
      this.textileBusiness = textileBusiness; 
      } 
      void insertPaymentDetails(PaymentDetails PaymentDetails) 
      { 
       TextileBusiness.insertPaymentDetails(PaymentDetails); 


      } 

     and my business class is 


package com.textile.web 

      public interface ITextileBusiness 
      { 
       public void insertPaymentDetails(PaymentDetails PaymentDetails); 
      } 

      package com.textile.web 
      public class TextileBusiness implements ITextileBusiness 
      { 
      ITextileDao textileDao; 

      public void setTextileDao(ITextileDao textileDao) { 
      this.textileDao = textileDao; 
      } 
      void insertPaymentDetails(PaymentDetails ormPaymentTable) 
      { 

       OrmPaymentTable ormPaymentTable= OrmPaymentTable(); 
       ormPaymentTable.setCustomerName(PaymentDetails.getCustomerName()); 
      ormPaymentTable.setAmount(PaymentDetails.getAmount();); 
       textileDao.insertPaymentDetails(ormPaymentTable); 
           int a=0; 
       if(a==0) 
        throw new BusinessException("Transcation Rollback");    

      } 
      } 
     and my dao class is 


package com.textile.web 
      public interface IPaymentsDao { 
       public void insertPaymentDetails(OrmPaymentTable ormPaymentTable); 
       } 
       package com.textile.web 
       public class PaymentsDao implements IPaymentsDao 
       { 
       void insertPaymentDetails(OrmPaymentTable ormPaymentTable) 
       { 
       this.getJpaTemplate().persist(ormPaymentTable); 
        after this line the record is insertinf into table    
       }    
       } 


      my FacesConfig.xml is 


    <application> 
      <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
      <locale-config> 
      <default-locale>en</default-locale> 
      <supported-locale>en</supported-locale> 
      </locale-config> 
      <message-bundle>Messages</message-bundle> 
      </application> 
      <managed-bean>   <managed-bean-name>textileUIBean</managed-bean-name>             <managed-bean-class>com.textile.web.TextileUIBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
</managed-bean> 

} 내 applicationConfig.xml 파일

<beans:bean id="dataSource" 
     class="org.springframework.jndi.JndiObjectFactoryBean" > 
     <beans: property name="jndiName"> 
      <beans: value>java:comp/env/jdbc/textWeb</beans:value> 
     </beans: property> 
     <beans: property name="resourceRef"> 
      <beans:value>true</beans:value> 
     </beans: property> 
    </beans: bean> 
     <beans: bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> 
     <beans: property name="entityManagerFactory"> 
      <beans: ref bean="entityManagerFactory" /> 
     </beans: property> 
    </beans: bean> 
    <beans: bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <!-- hidden by shiju because we need one datasource support its in prsistence.xml !--> 
     <beans: property name="dataSource"> 
      <beans: ref bean="dataSource" /> 
     </beans: property> 
     <beans: property name="persistenceUnitName" value="payhub" /> 
     <beans: property name="jpaVendorAdapter"> 
      <beans:bean 
       class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <beans: property name="generateDdl" value="false" /> 
       <beans: property name="showSql" value="true" /> 
       <beans: property name="databasePlatform" value="${database.target}" /> 
      </beans: bean> 
     </beans: property> 
     <beans: property name="persistenceXmlLocation"> 
      <beans: value>classpath:META-INF/persistence.xml</beans:value> 
     </beans: property> 
    </beans: bean> 
<beans:bean id="textileManager" 
     class=" com.textile.web.TextileManager"> 
     <beans: property name="textileBusiness" ref="textileBusiness" /> 
    </beans: bean> 
    <beans: bean id="textileBusiness" class="com.textile.web.TextileBusiness"> 
     <beans: property name="textileDao" ref="textileDao" />  
    </beans: bean> 
    <beans: bean id="textileDao" class="com.textile.web.textileDao"> 
     <beans: property name="jpaTemplate"> 
      <beans: ref bean="jpaTemplate"/> 
     </beans: property> 
    </beans: bean> 

    <aop:config> 
      <aop:pointcut id="fooServiceOperation" expression="execution(* com.textile.web.*.*(..))"/> 
      <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/> 
      </aop:config> 
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes>    
      <tx:method name="*" propagation="REQUIRED"/> 
     </tx:attributes> 
    </tx:advice> 

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

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

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

and orm.xml file is 




<entity class="OrmPaymentTable" name="OrmPaymentTable"> 
<table name="ta_payment" /> 
<attributes> 
<id name="paymentId"> 
<column name="USER_ID" /> 
<generated-value strategy="AUTO" /> 
</id> 
<basic name="customerName"> 
<column name="CUST_NAME" length="50" /> 
</basic> 
<basic name="amount"> 
<column name="AMOUNT" length="50" /> 
</basic> 
</attributes> 
</entity> 

<persistence-unit name="payhub" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:comp/env/jdbc/textWeb</jta-data-source> 
     <mapping-file>META-INF/orm.xml</mapping-file> 
     <class>com.textile.web.OrmPaymentTable</class> 
     <properties> 
      <property name="hibernate.transaction.manager_lookup_class" 
       value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/> 

      <property name="hibernate.transaction.factory_class" 
       value="org.hibernate.transaction.JTATransactionFactory" /> 
</properties> 
    </persistence-unit> 
</persistence> 

내가 META-INF에서의 JNDI/context.xml에

<Context> 
     <Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory"/> 
     <Resource name="jdbc/textWeb" auth="Container" 
     driverClassName="com.mysql.jdbc.Driver" user="root" password="root" 
     type="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" factory="com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory" 
     url="jdbc:mysql://localhost:3306/textWeb" explicitUrl="true" 
     pinGlobalTxToPhysicalConnection="true"> 
    </Resource> 
    </Context> 

web.xml 

     <resource-ref> 
    <description>PaymentsDatabase</description> 
    <res-ref-name>jdbc/textWeb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 

내가 로그 추적을 구성 .. 내역 로그보기

78 [main] INFO atomikos - USING core version: 3.6.4 
78 [main] INFO atomikos - USING com.atomikos.icatch.console_file_name = tm.out 
78 [main] INFO atomikos - USING com.atomikos.icatch.console_file_count = 1 
78 [main] INFO atomikos - USING com.atomikos.icatch.automatic_resource_registration = true 
78 [main] INFO atomikos - USING com.atomikos.icatch.client_demarcation = false 
78 [main] INFO atomikos - USING com.atomikos.icatch.threaded_2pc = true 
78 [main] INFO atomikos - USING com.atomikos.icatch.serial_jta_transactions = false 
78 [main] INFO atomikos - USING com.atomikos.icatch.log_base_dir = .\ 
94 [main] INFO atomikos - USING com.atomikos.icatch.console_log_level = WARN 
94 [main] INFO atomikos - USING com.atomikos.icatch.max_actives = 50 
94 [main] INFO atomikos - USING com.atomikos.icatch.checkpoint_interval = 500 
94 [main] INFO atomikos - USING com.atomikos.icatch.enable_logging = false 
94 [main] INFO atomikos - USING com.atomikos.icatch.output_dir = .\ 
94 [main] INFO atomikos - USING com.atomikos.icatch.log_base_name = tmlog 
94 [main] INFO atomikos - USING com.atomikos.icatch.console_file_limit = 0 
94 [main] INFO atomikos - USING com.atomikos.icatch.max_timeout = 300000 
94 [main] INFO atomikos - USING com.atomikos.icatch.tm_unique_name = PaymentsTransactions 
94 [main] INFO atomikos - USING java.naming.factory.initial = com.sun.jndi.rmi.registry.RegistryContextFactory 
94 [main] INFO atomikos - USING java.naming.provider.url = rmi://localhost:1099 
94 [main] INFO atomikos - USING com.atomikos.icatch.service = com.atomikos.icatch.standalone.UserTransactionServiceFactory 
94 [main] INFO atomikos - USING com.atomikos.icatch.force_shutdown_on_vm_exit = false 
94 [main] INFO atomikos - USING com.atomikos.icatch.default_jta_timeout = 10000 
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(469) | Using JTA UserTransaction: [email protected] 
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(480) | Using JTA TransactionManager: [email protected] 
DEBUG - NameMatchTransactionAttributeSource.addTransactionalMethod(94) | Adding transactional method [*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT] 
DEBUG - AbstractPlatformTransactionManager.getTransaction(365) | Creating new transaction with name [com.evolvus.payments.manager.IPaymentsManager.findColumnChartDisplayByGateWays]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
40500 [http-8080-Processor24] WARN atomikos - Attempt to create a transaction with a timeout that exceeds com.atomikos.icatch.max_timeout - truncating to: 300000 
40641 [http-8080-Processor24] INFO atomikos - THREADS: using JDK thread pooling... 
40703 [http-8080-Processor24] INFO atomikos - createCompositeTransaction (3000000): created new ROOT transaction with id PaymentsTransactions0000100688 
DEBUG - AbstractPlatformTransactionManager.handleExistingTransaction(470) | Participating in existing transaction 
DEBUG - AbstractPlatformTransactionManager.handleExistingTransaction(470) | Participating in existing transaction 
DEBUG - AbstractPlatformTransactionManager.processRollback(850) | Participating transaction failed - marking existing transaction as rollback-only 
DEBUG - JtaTransactionManager.doSetRollbackOnly(1060) | Setting JTA transaction rollback-only 
49110 [http-8080-Processor24] INFO atomikos - setRollbackOnly() called for transaction PaymentsTransactions0000100688 
DEBUG - AbstractPlatformTransactionManager.processRollback(843) | Initiating transaction rollback 
49172 [http-8080-Processor24] INFO atomikos - afterCompletion (STATUS_ROLLEDBACK) called on Synchronization: org.hibernate.transaction.CacheSynchronization 
49172 [http-8080-Processor24] INFO atomikos - afterCompletion (STATUS_ROLLEDBACK) called on Synchronization: [email protected] 
49172 [http-8080-Processor24] INFO atomikos - rollback() done of transaction PaymentsTransactions0000100688 

도와 주시겠습니까?

+2

이 소리 단순히 트랜잭션을 지원하지 않습니다. –

+0

나는 db를 검사했다. InnoDB 테이블 만 사용하고있다. 다른 제안 사항은 무엇입니까? 포인트 컷 ID = "fooServiceOperation"표현 = "실행 (* com.textile : 답장을 보내 –

답변

3

명확하게 트랜잭션 관리자의 현재 트랜잭션 범위 내에서 데이터베이스 삽입이 일어나지 않습니다.

몇 가지 아이디어 :

1) 아마 그것 그냥 당신의 게시물에,하지만 난 당신의 서비스 클래스에 봄 @Transactional 주석을 볼 수 없습니다. 트랜잭션 경계를 제어하기위한 전략은 무엇입니까?

2) JNDI를 사용하고 있으므로 데이터 소스를 볼 수 없지만 Atomikos를 사용하는 경우 XA 인식 풀링 데이터 소스를 사용해야합니다. 너?

3) 처리중인 SQL 명령을 정확히 보려면 ​​Atomikos 정상 로깅을 DEBUG로 늘려야합니다.

4) Atomikos는 일반 로그 파일 외부에있는 트랜잭션 로그를 유지합니다. 이들은 복구 및 기타 목적으로 사용됩니다. 또한 단서를 확인해야합니다.

희망이 도움이됩니다.

업데이트 :

MySQL은 당신이 여기에 대한 here 수 XA 트랜잭션과 함께 몇 가지 제한 사항이 있습니다. context.xml에서이 구성을 시도해보고 적어도 작동하는지 확인하십시오.Atomikos의 XA 인식 (XA 가능) 데이터 소스를 사용합니다. 이 후 작동하면 당신은 거기에서 갈 수

<Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory" />

과 당신의 엔티티 관리자에 주입에 대한 JNDI 데이터 소스를 정의 : 당신이 백그라운드에서의 MyISAM을 사용하는 것처럼

<Resource name="jdbc/myDataSource" auth="Container"
factory="org.apache.naming.factory.BeanFactory"
type="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"
uniqueResourceName="myMySqlDatabase" driverClassName="com.mysql.jdbc.Driver" url="......" user="....." password="...." maxPoolSize="20" reapTimeout="300" />

+0

정말 감사 .. 트랜잭션 경계를 제어하기위한 –

+0

하이 Hdave 정말 답장을 보내 주셔서 감사 1 전략은 가 트랜잭션 경계를 처리합니다. XA 인식 풀링 데이터 소스 metainf의 구성 –

+0

메신저/context.xml에 <트랜잭션 공장 = "com.atomikos.icatch.jta.UserTransactionFactory"/> <자원 이름 = "JDBC/textWeb"인증 = "컨테이너" password = "root" type = "com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"factory = "com.mysql.jdbc.jdbc2.optional. MysqlDataSourceFactory " URL ="JDBC한다 : mysql : // localhost를 : 3306/textWeb "explicitUrl ="true "를 pinGlobalTxToPhysicalConnection ="진정한 ">

관련 문제