У меня есть функция, которая изменяет две таблицы с помощью транзакции javax.
@Transactional //javax transaction
public PayoutTransaction createPayoutTxnAndUpdateDailyPayout(
PayoutTransaction payoutTransactionModel, List<DailyPayout> dailyPayouts) throws Exception {
try {
PayoutTransaction payoutTransaction =
(PayoutTransaction) payoutTransactionDao.save(payoutTransactionModel);
updateTransactionId(null, DailyPayoutStatus.PICKED, dailyPayouts);
return payoutTransaction;
} catch (Exception exc) {
LOGGER.error("Error while creating payout transaction with exception: {}",
CommonUtil.exceptionFormatter(exc));
throw exc;
}
}
updateTransactionId функция
private void updateTransactionId(Long payoutId, DailyPayoutStatus dailyPayoutStatus,
List<DailyPayout> dailyPayouts) throws Exception {
List<Long> dailyPayoutIds = new ArrayList<>();
int retryCount = dailyPayouts.get(0).getRetryCount();
dailyPayouts.stream().forEach(dailyPayout -> dailyPayoutIds.add(dailyPayout.getId()));
if (!NullOrEmptyCheckerUtil.isNullOrEmpty(payoutId)) {
dailyPayoutDao.updatePayoutTransactionId(dailyPayoutIds, payoutId, DailyPayoutStatus.SUCCESS);
} else {
dailyPayoutDao.updateDailyPayoutStatus(dailyPayoutIds, DailyPayoutStatus.NOT_PICKED,
retryCount + 1);
}
}
И теперь в моем сохранении также есть весеннее трэскактион вроде этого
@Override
@Transactional
public Object save(final Object object) {
Serializable id = hibernateTemplate.save(object);
return get(object.getClass(), id);
}
Теперь, если что-то ломается в моей функции updateTransactionId, она не выполняет откат моей функции сохранения. Насколько мне известно, родительская транзакция (транзакция javax) должна переопределить мою весеннюю транзакцию и должна откатить мои данные функции сохранения, чего не происходит.
Это то, что я пытаюсь спросить, потому что мои внешние транзакции должны перекрывать мои весенние транзакции.
Как указано либо неправильная настройка, либо механизм хранения без поддержки tx.
Я использую mysql
Проверьте свои таблицы, вероятно, они используют MyISAM в качестве механизма хранения. MyISAM не поддерживает транзакции.
ДВИГАТЕЛЬ = InnoDB AUTO_INCREMENT = 3 СИМВОЛЫ ПО УМОЛЧАНИЮ = latin1 |
Проверьте свою таблицу, а не конфигурацию mysql. Вы используете Hibernate, если вы используете спящий режим для управления своей схемой, в зависимости от выбранного вами диалекта, он все равно будет создавать таблицы MyISAM. Вот почему я сказал проверить свои таблицы.
Это на уровне моей таблицы, а не на уровне базы данных
Что ж, тогда ваша настройка tx просто неправильно настроена. Однако, поскольку вы не включили конфигурацию, что не так, будет игрой в угадывание.
Я понял. Это происходит потому, что я автоматически подключил свой dao к своей службе, и отдельный dao имеет транзакционный метод с помощью there. есть ли способ, которым я могу заставить мой уровень dao использовать мой сервис для транзакций?
Это поведение по умолчанию ... Тот факт, что это не так, вероятно, потому, что вы неправильно настроили свою tx-инфраструктуру.




Это означает, что либо у вас неправильная настройка транзакции, в которой у вас нет транзакции, либо вы используете механизм базы данных / хранилища, который не поддерживает транзакции (например, MySQL с таблицами MyISAM). Кроме того, исключение может возникнуть только после фиксации транзакции, поэтому после внешней транзакции, которая в основном делает ваш внутренний
try/catchбесполезным.