обрабатывать отдельную транзакцию в java партии (JSR-352) - PullRequest
0 голосов
/ 18 февраля 2020

Я использую jberet реализацию спецификаций пакета JSR 352 java.

На самом деле мне нужна отдельная транзакция для отдельного обновления, что-то вроде этого:

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();
    }
}

I сначала попытался пометить resetLastProductsUpdateDate метоаду как @Transactional (REQUIRES_NEW), однако это не сработало.

Мой вопрос:

  1. Есть ли более элегантный способ для достижения этой особой транзакции без ручного управления транзакцией?
  2. Хотя UserTransation работает, EntityManager.transaction - нет. Я не понимаю, почему.
  3. Класс ниже, который вводится из Batchlet, работает правильно; Почему я не могу заставить работать аннотацию @Transactional для метода resetLastProductsUpdateDate ?

    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);
    }
    

    }

EDIT

На самом деле я полагаю, что ни одна пользовательская транзакция не является хорошим решением, поскольку она влияет на управление транзакциями всего элемента записи. До сих пор не знаю, как бороться с изоляцией транзакций: (* ​​1031 *

1 Ответ

1 голос
/ 18 февраля 2020

В общем случае пакетное приложение должно избегать непосредственной обработки транзакции. У вас может быть свой пакетный компонент, который будет выдавать некоторые бизнес-исключения при определенных условиях, и сконфигурировать вашу работу. xml, чтобы вызвать повторную попытку при этом бизнес-исключении. При повторной попытке все отдельные данные будут обрабатываться и фиксироваться в своем собственном блоке.

...