发现后台使用atomikos进行事务提交时报javax.transaction.RollbackException: Prepare: NO vote,造成这个事务的主要原因是使用atomikos时,事务默认超时时间是100000毫秒,超过这个时间,提交事务就会抛出异常com.atomikos.icatch.RollbackException: Prepare: NO vote。
解决办法是
(1)需要在classpath下建一个jta.properties(或者transactions.properties)文件(事务管理器的配置)
#配置事务最大连接数为无限
com.atomikos.icatch.max_actives=-1
# 默认的超时时间 600000 --> 10分钟
com.atomikos.icatch.default_jta_timeout = 600000
# 设置事务的最大超时时间
com.atomikos.icatch.max_timeout = 6000000
注:
default_jta_timeout与com.atomikos.icatch.max_timeout的区别:default_jta_timeout表示开启事务时,默认的超时时间,max_timeout表示最大的超时时间,有人说是设置为0是无限,可能是atomikos版本不同的原因,我设置为0无效,最终设置的时间大一点。如果default_jta_timeout设置的值超过了max_timeout,会自动将超时时间截断,使用max_timeout的值(日志会打印出来)。
(2)修改Spring的配置文件
<!-- Atomikos 事务管理器配置 -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- <property name="startupTransactionService" value="false" /> -->
<!-- close()时是否强制终止事务 -->
<property name="forceShutdown" value="false" />
</bean>
<!-- Atomikos UserTransaction配置 -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"></bean>
<!-- JTA事务管理器 -->
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
</bean>
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />