【发布时间】: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),但是没有成功。
我的问题是:
- 有没有更优雅的方式来实现这个单一的事务,而无需手动处理事务?
- 虽然 UserTransation 有效,但 EntityManager.transaction 无效。我不明白为什么。
-
从 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 事务管理。还是不知道如何处理事务隔离:(
【问题讨论】: