Я использую 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), однако это не сработало.
Мой вопрос:
- Есть ли более элегантный способ для достижения этой особой транзакции без ручного управления транзакцией?
- Хотя UserTransation работает, EntityManager.transaction - нет. Я не понимаю, почему.
Класс ниже, который вводится из 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 *