Транзакция javax не выполняет откат, если используется с транзакцией гибернации

У меня есть функция, которая изменяет две таблицы с помощью транзакции 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) должна переопределить мою весеннюю транзакцию и должна откатить мои данные функции сохранения, чего не происходит.

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

M. Deinum 27.09.2018 09:15

Это то, что я пытаюсь спросить, потому что мои внешние транзакции должны перекрывать мои весенние транзакции.

Atul Agrawal 27.09.2018 09:44

Как указано либо неправильная настройка, либо механизм хранения без поддержки tx.

M. Deinum 27.09.2018 10:04

Я использую mysql

Atul Agrawal 27.09.2018 12:53

Проверьте свои таблицы, вероятно, они используют MyISAM в качестве механизма хранения. MyISAM не поддерживает транзакции.

M. Deinum 27.09.2018 12:54

ДВИГАТЕЛЬ = InnoDB AUTO_INCREMENT = 3 СИМВОЛЫ ПО УМОЛЧАНИЮ = latin1 |

Atul Agrawal 27.09.2018 13:02

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

M. Deinum 27.09.2018 13:05

Это на уровне моей таблицы, а не на уровне базы данных

Atul Agrawal 27.09.2018 13:24

Что ж, тогда ваша настройка tx просто неправильно настроена. Однако, поскольку вы не включили конфигурацию, что не так, будет игрой в угадывание.

M. Deinum 27.09.2018 13:26

Я понял. Это происходит потому, что я автоматически подключил свой dao к своей службе, и отдельный dao имеет транзакционный метод с помощью there. есть ли способ, которым я могу заставить мой уровень dao использовать мой сервис для транзакций?

Atul Agrawal 28.09.2018 06:53

Это поведение по умолчанию ... Тот факт, что это не так, вероятно, потому, что вы неправильно настроили свою tx-инфраструктуру.

M. Deinum 28.09.2018 13:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
53
0

Другие вопросы по теме