【问题标题】:handle separate transaction in java batch (JSR-352)在 Java 批处理中处理单独的事务 (JSR-352)
【发布时间】:2020-02-18 14:46:56
【问题描述】:

我正在使用 JSR 352 java 批处理规范的 jberet 实现。

实际上我需要一个单独的事务来进行单一更新,如下所示:

class MyItemWriter implements ItemWriter

@Inject
UserTransaction transaction

void resetLastProductsUpdateDate(String uidCli) throws BusinessException {
    try {
        if (transaction.getStatus() != Status.STATUS_ACTIVE) {
            transaction.begin();
        }
        final Customer customer = dao.findById(id);
        customer.setLastUpdate(null);
        customer.persist(cliente);
        transaction.commit();
    } catch (RollbackException | HeuristicMixedException | HeuristicRollbackException | SystemException | NotSupportedException e) {
        logger.error("error while updating user products last update");
        throw new BusinessException();
    }
}

我首先尝试将 resetLastProductsUpdateDate 方法标记为 @Transactional(REQUIRES_NEW),但是没有成功。

我的问题是:

  1. 有没有更优雅的方式来实现这个单一的事务,而无需手动处理事务?
  2. 虽然 UserTransation 有效,但 EntityManager.transaction 无效。我不明白为什么。
  3. 从 Batchlet 注入的下面的类可以正常工作;为什么我不能在 resetLastProductsUpdateDate 方法上使用 @Transactional 注释?

    public class DynamicQueryDAO {
    
    @Inject
    EntityManager entityManager;
    
    @Inject
    private Logger logger;
    
    @Transactional(Transactional.TxType.REQUIRED)
    public void executeQuery(String query) {
    
        logger.info("executing query: {}", query);
    
        final int output = entityManager.createNativeQuery(query).executeUpdate();
    
        logger.info("rows updated: {}", output);
    }
    

    }

编辑

实际上,我认为 usertransaction 都不是一个好的解决方案,因为它会影响整个 itemwriter 事务管理。还是不知道如何处理事务隔离:(

【问题讨论】:

    标签: java-ee-7 jsr352 jberet


    【解决方案1】:

    通常批处理应用程序应避免直接处理事务。你可以让你的批处理组件在某些条件下抛出一些业务异常,并配置你的 job.xml 来触发这个业务异常的重试。在重试期间,每个单独的数据都将在其自己的块中进行处理和提交。

    【讨论】:

    • batchlet 呢?在 batchlet 中有一些 jpa 事务是很常见的情况,但是这个组件似乎不以任何方式处理事务
    • 我没有尝试过这种情况,但我认为你可以使用 jpa 的资源本地实体事务。如果需要与其他组件进行事务协调,则查找 UserTransaction 并将其用于 jpa 操作。
    猜你喜欢
    • 2014-07-15
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多