使用atomikos分布式事务报com.atomikos.icatch.RollbackException: Prepare: NO vote异常解决办法

发现后台使用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" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值