在两阶段提交事务中使用非XA数据源时抛出异常

时间:2015-01-05 12:34:35

标签: java spring oracle websphere

我的Websphere应用程序有3个datsources。其中两个是XA,另一个是非XA。

我通过使用@transactional注释注释方法来创建Java方法事务。

在该方法中,执行3个任务。第一个是使用一个XA数据源进行更新,然后第二个使用非XA数据源选择一些记录,最后一个任务使用另一个XA数据源再次进行更新。

但是,抛出异常会出现以下错误: An illegal attempt to commit a one phase capable resource with existing two phase capable resources

我想知道为什么上面的错误会发生,即使我的应用程序只使用非XA来选择一些数据而且不需要提交,如果我不允许更改非XA,我该如何解决问题数据源到XA。

2 个答案:

答案 0 :(得分:1)

默认情况下,非XA资源不能参与分布式事务。所以你有以下选择:

  • 将数据源更改为XA - 您写道,您不能这样做
  • 尝试启用Last Participant Support - 最后一个参与者支持是事务服务的扩展,它允许单个单阶段资源参与具有一个或多个两阶段资源的两阶段事务。
  • 如果您不需要事务处理,请将此(nonXA)数据源设置为非事务性数据源。它不会被列入交易:
Select Resources > JDBC > Data sources
Select the name of the data source that you want to configure.
Select WebSphere Application Server data source properties from the Additional Properties heading.
Select Non-transactional data source.
Click OK.
  • 在EJB中包装nonXA调用,并将其标记为不支持事务。
  • 手动管理事务 - 不要使用容器管理事务,而是使用Transaction API手动处理方法内的事务。

答案 1 :(得分:0)

启动第二个任务时,在您使用need to be commit or rolled back注释时对XA数据源@Transaction执行更新的上一个任务会自动完成一个事务,因此请勿使用@事务注释而不是它将每个任务放在单独的事务中