【问题标题】:Exception thrown when using non-XA datasource in two-phase commit transaction在两阶段提交事务中使用非 XA 数据源时引发异常
【发布时间】:2015-01-05 12:34:34
【问题描述】:

我的 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。

【问题讨论】:

    标签: java spring oracle websphere


    【解决方案1】:

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

    • 将数据源更改为 XA - 你写道你不能这样做
    • 尝试启用Last Participant Support - 最后参与者支持是对事务服务的扩展,它使单个单阶段资源能够参与具有一个或多个两阶段资源的两阶段事务。
    • 将此(非XA)数据源设置为非事务性,如果您不需要它的事务。它不会被列入交易:
    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 中包装该非 XA 调用,并将其标记为不支持事务。
    • 手动管理事务 - 不要使用容器管理事务,而是使用事务 API 在您的方法中手动处理事务。

    【讨论】:

      【解决方案2】:

      当开始第二个任务时,前一个任务在 XA 数据源 need to be commit or rolled back 上进行更新,而您正在使用 @Transaction 批注,整个任务会自动执行一个事务,因此不要使用 @Transaction 批注,而是使用它将每个任务放在单独的事务中

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 2012-01-20
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 2011-10-13
        • 2014-09-12
        • 2015-09-06
        • 1970-01-01
        相关资源
        最近更新 更多