我们正在尝试将Websphere迁移到Tomcat,其中需要迁移两个基本组件。我们将连接池管理迁移到Hikari,将事务管理迁移到Atomikos。 Hibernate不是由Spring管理的,数据源也不是由spring管理的。春天通过注入atomikos实现来提供事务管理。
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.J2eeUserTransaction">
<property name="transactionTimeout" value="180"/>
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"
depends-on="atomikosTransactionManager,atomikosUserTransaction">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
<property name="allowCustomIsolationLevels" value="true" />
</bean>
Hibernate配置文件单独加载,并提供Hikari数据源和事务配置类,如下所示: com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
我们没有更改hikari中的autocommit标志,我认为默认值为true。
Websphere事务管理器能够回滚任何会话更新,但上述配置无法执行。例如,对于以下代码,websphere事务管理器回滚事务:
Session session = null;
try{
userTransactionService.begin();
session = factory.getSession();
session.saveorUpdate(acccount);
session.flush();
String abc = null;
abc.length(); // line 8
userTransactionService.commit();
}
catch(Exception e){
userTransactionService.rollback();
}
当通过Atomikos提供userTransaction且Hikari是数据源时,事务在第8行发生异常后不会回滚。
我甚至尝试过使用Websphere事务管理器和Hikari数据源,但事务仍然没有回滚。
我无法将Hikari中的自动提交设置为错误,因为在很多地方我们根本不使用事务管理器(开始)而只使用session.saveOrUpdate。对于websphere数据源,它会持久存储在数据库中,但在Hikari的情况下则不会持续存在(因为自动提交是错误的)。
请帮助解决如何实现与Websphere提供的功能相同的功能,不会影响系统中的大量代码。