Atomikos Forum

JPA transcation rollback is not working

Hi all
  I have done an application configuration using hybernate + JPA ,and atomikos for XA transcation management and spring 3.0 ,here every thing is working fine however insert operation, when exception is throwing the transcation should rollback,but it is not happening!!
  here is a small flow for our application, in our manager level we are  calling the businesss (here we are using Spring IOC)
 my Manager.java       
        insertuser()
        {
         //here we are getting transcation support from spring.
        
          business.insertuser();
        }
               
        business.java we are using one method insertuser() 
          insertuser()
          {
            Tauser taUser=new Tauser();
            taUser.setUsername("Maya");
            taUser.setPassword("*****")     
            Dao.insertDetails(taUser);
             throw new NullPointerException("checking transcation management"); // because  of this exception throwing,it should rollback right,but its not happening.The property's are commiting in to the table.
             
        }
        and our dao.java class we are using one method insertuser(Object entity)
   
    void insertDetails(Object entity)
      {
        this.getJpaTemplate().persist(entity);     
      }
     
      and our     orm.xml 
     
          <entity class="TaUser" name="TaUser">
        <table name="ta_user" />
        <attributes>
            <id name="userId">
                <column name="USER_ID" />
                <generated-value strategy="AUTO" />
            </id>
            <basic name="userName">
                <column name="USER_NAME" length="50" />
            </basic> 
            </attributes>
    </entity>
   
  and my persistence.xml file is
 
  <persistence-unit name="shop" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:comp/env/jdbc/shobWeb</jta-data-source>
          <mapping-file>META-INF/orm.xml</mapping-file>
          <class>TaUser</class>
          ---------
          ---------
          ---------
          <properties>
            <property name="hibernate.transaction.manager_lookup_class"
            value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
            </properties>   
    </persistence-unit>
  </persistence>
  and i configured my jndi in  application/meta_inf/context.xml
  <Resource name="jdbc/shobWeb" 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/shobWebSample"
                      explicitUrl="true"
                      pinGlobalTxToPhysicalConnection="true"
                      ></Resource>
                     
                      and my config file is
                      config.xml
                     
                      <beans:bean id="Manager"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <beans: property name="transactionManager">
            <beans: ref bean="transactionManager" />
        </beans: property>
        <beans: property name="target">
            <beans: ref local=" ManagerTarget" />
        </beans: property>
        <beans: property name="transactionAttributes">
            <beans: props>
                <beans: prop key="*">PROPAGATION_REQUIRED</beans:prop>
            </beans: props>
        </beans: property>
    </beans: bean>

    <beans: bean id="ManagerTarget"
        class="Manager">
        <beans: property name="Business" ref="Business" />
    </beans: bean>
    <beans: bean id="Business" class="PaymentsBusiness">
        <beans: property name="Dao" ref=" Dao" />             
    </beans:bean>
    
    <beans:bean id="Dao"
        class=" Dao">
        <beans: property name="jpaTemplate">
            <beans: ref bean="jpaTemplate" />
        </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">
     <beans: property name="persistenceUnitName" value="shop" />
        <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: bean>
        </beans: property>
        <beans: property name="persistenceXmlLocation">
            <beans :value>classpath:META-INF/persistence.xml</beans: value>
        </beans: property>
    </beans: bean>
    
    where is the issue? Actually when i am trying to update some property in table then transcation is working fine (rollback and commit is  happening ),but when i am trying to do insert operation rollback is not happening.
maya Send private email
Wednesday, December 08, 2010
 
 
Hi,

This requires log file analysis - do you have a budget for developer access?

Thanks
Guy Pardon Send private email
Wednesday, December 15, 2010
 
 
i dont have.please try to see below.i updated clear code with transcation log
"Transaction rollbacks, but a record is inserted"
 
  i am using jsfmanagedbean  to cal my servive,from my service class my transcation will start
       
         TextileUIBean.java 
         package com.textile.web;
         public class TextileUIBean extends BaseManagedBean implements Serializable,
         {
         public  insertPaymentDetails()
            {
          PaymentDetails  PaymentDetails=new PaymentDetails();
          // values are hard coded ans only two propereties  only using
          PaymentDetails.setCustomerName("Manikandan");
          PaymentDetails.setAmount(1000);
          getTextileManager().insertPaymentDetails(PaymentDetails);
          }
              public 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);
                  int a=0;
                if(a==0)
                    throw new BusinessException("Transcation Rollback");            
                         
             }
            
            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);
                         
             }
             }
             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>
    
and my applicationConfig.xml file is
<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>
and i configure jndi in meta-inf/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>
 I trace the log.. see my transcation log details
 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: com.atomikos.icatch.jta.UserTransactionImp@16a6027
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(480) | Using JTA TransactionManager: com.atomikos.icatch.jta.UserTransactionManager@e68513
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: org.hibernate.ejb.EntityManagerImpl$1@1f6e48a
49172 [http-8080-Processor24] INFO atomikos - rollback() done of transaction PaymentsTransactions0000100688
maya Send private email
Thursday, December 16, 2010
 
 
Guy Pardon Send private email
Monday, December 20, 2010
 
 
hi Guy Pardon ,
    i tried that link what you suggested me(
http://www.atomikos.com/Documentation/HibernateIntegration#With_JPA).That is working but  that is not pure JPA.We planned to implement pure JPA.Could you give me any other suggestions ?
maya Send private email
Tuesday, December 21, 2010
 
 
Like it says in the doc: please try leaving out the hibernate.transaction.factory_class
Guy Pardon Send private email
Wednesday, December 22, 2010
 
 
really thanks for your reply
i changed my transaction factory  "com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory"

<property name="hibernate.transaction.factory_class"
                value="com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory"/>

  and tried,that time also i got the same rollback problem.
 So i changed my datasource as nonxa
  i changed my context.xml like this

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

now its working .. but i should need xadatasource configuration for mysql..please reply me
maya Send private email
Wednesday, December 22, 2010
 
 
Please leave out the "hibernate.transaction.factory_class" - read the link Guy wrote or the Hibernate docs linked at the wiki - its not needed anymore.
If you want to set it take the:

org.hibernate.ejb.transaction.JoinableCMTTransactionFactory

but this is "implementation" detail of hibernate - let hibernate choose the "right" JTA factory to use as you do not need to set it anymore.
Torsten Krah Send private email
Tuesday, January 04, 2011
 
 

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics