-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Help w/ JTA transaction with two datasources
PostPosted: Thu Oct 18, 2007 11:09 am 
Newbie

Joined: Tue Sep 11, 2007 12:17 pm
Posts: 9
Hello folks,

I am having an issue with transactions using Hibernate/Spring/JTA/JOTM. The problem is that, a transaction that is executed in one database is not rolled back if the second database's transaction fails Here is the spring configuration file:


Code:
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />

<bean id="xaDataSource1" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown" lazy-init="default" autowire="default" dependency-check="default">
<property name="transactionManager">
   <ref local="jotm" />
</property>
<property name="driverName">
   <value>oracle.jdbc.driver.OracleDriver</value>
</property>
   ....
</bean>
   
<bean id="xaDataSource2" class="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown" lazy-init="default" autowire="default" dependency-check="default">
<property name="transactionManager">
      <ref local="jotm" />
</property>
<property name="driverName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
....
</bean>


<bean id="SessionFactory1"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="xaDataSource1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache-2.xml</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
....
</list>
</property>
</bean>

<bean id="SessionFactory2"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="xaDataSource2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache-2.xml</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
....
</list>
</property>
</bean>
   

<bean id="TrxManager" class="org.springframework.transaction.jta.JtaTransactionManager" lazy-init="default" autowire="default" dependency-check="default">
<property name="userTransaction">
<ref local="jotm" />
</property>
</bean>

<tx:annotation-driven transaction-manager="TrxManager"  />

<bean id="CreationManager" class="com.example.CreationManager" >
<property name="databaseManager">
   <ref local="DatabaseManager" />
</property>
</bean>

<bean id="DatabaseManager" class="com.example.DatabaseManager">
<property name="db1DAO">
   <ref local="database1DAO" />
</property>
<property name="db2DAO">
   <ref local="database2DAO" />
</property>
</bean>


<bean id="database1DAO" class="com.example.Database1DAO">
<property name="sessionFactory">
   <ref local="SessionFactory1" />
</property>
</bean>
   
<bean id="database2DAO" class="com.example.Database2DAO">
<property name="sessionFactory">
      <ref local="SessionFactory2" />
</property>
</bean>


DatabaseManager.java
Code:
@Transactional(readOnly=true)
public class FutureDatabaseManager implements IFutureDatabaseManager {

   private Database1DAO db1DAO;
   private Database2DAO db2DAO;
   
   public Database1DAO getDb1DAO() {
      return db1DAO;
   }

   public void setDb1DAO(Database1DAO db1DAO) {
      this.db1DAO = db1DAO;
   }

   public database2DAO getDb2DAO() {
      return db2DAO;
   }

   public void setDb2DAO(database2DAO db1DAO) {
      this.db2DAO = db2DAO;
   }
   
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public void createFuture(String dbString)
{
   db1DAO.save(dbString);
   db2DAO.save(dbString);
}

}


Database1DAO.java
Code:
@Transactional(readOnly=true)
public class Database1DAO extends HibernateDaoSupport
{
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public void save(String dbString)
{
  Database1Object obj1=new Database1Object();
  obj1.setDBString(dbString);
  getHibernateTemplate().save(obj1);
}
}


Database2DAO.java
Code:
@Transactional(readOnly=true)
public class Database2DAO extends HibernateDaoSupport
{
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public void save(String dbString)
{
  Database2Object obj1=new Database2Object();
  obj1.setDBString(dbString);
  getHibernateTemplate().save(obj1);
}
}


In the logs, I see the following after database1's statement executes:
Code:
10:33:01,416 DEBUG AbstractFlushingEventListener:171 - Flushing entities and processing referenced collections
10:33:01,416 DEBUG AbstractFlushingEventListener:210 - Processing unreferenced collections
10:33:01,416 DEBUG AbstractFlushingEventListener:224 - Scheduling collection removes/(re)creates/updates
10:33:01,416 DEBUG AbstractFlushingEventListener:85 - Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
10:33:01,416 DEBUG AbstractFlushingEventListener:91 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections


It seems that there is some sort of autocommit going on, or a new transaction being created.

Could someone please point me in the right direction, I'd really appreciate it!


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.