我的Websphere应用程序有3个数据源。其中两个是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,如何解决该问题? 。

最佳答案

默认情况下,非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.




将那个nonXA调用包装在EJB中,并将其标记为不支持事务。
手动管理交易-不使用容器管理的交易,而是使用Transaction API在您的方法内部手动处理交易。

关于java - 在两阶段提交事务中使用非XA数据源时引发异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27779650/

10-09 13:46