Spring Boot + JPA: аннотация @Transactional: откат не работает - PullRequest
0 голосов
/ 21 января 2019

Я использую @Transactional с весенней загрузкой и jpa.Но это не работает.Может кто-нибудь помочь.

Мои вставки находятся в myDAO, который автоматически подключен в классе обслуживания.Ниже приведен код класса сервиса, который реализует интерфейс сервиса

class MyService implements Service {

@Transactional(rollbackFor = RuntimeException.class)
    public ResponseVO createOrder(params) {
    myDAO.insertInTable1(param);
    myDAO.insertInTable2(param);//I kept wrong table name in this query such that it throws exception
         }

 }

Ответы [ 5 ]

0 голосов
/ 22 января 2019

Проблема с движком базы данных MySQL.Мой движок был MYIsam, который не поддерживает транзакции.Я изменил мой движок БД на InnoDB и он работает.Спасибо за вклад.Ниже приведены запросы для одного и того же.

ВЫБРАТЬ ДВИГАТЕЛЬ ИЗ information_schema.TABLES, ГДЕ TABLE_NAME = 'tabel_name' AND TABLE_SCHEMA = 'db_name';

ALTER TABLE table_name ENGINE = INNODB;

0 голосов
/ 21 января 2019

RuntimeException уже обработано

заменить на @Transactional(rollbackFor = Exception.class) для управления всеми отмеченными исключениями и будет работать

0 голосов
/ 21 января 2019

Попробуйте это:

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)

Надеюсь, это поможет.

Ура !!

0 голосов
/ 21 января 2019

В Spring Boot OpenSessionInView включен по умолчанию, поэтому ваш откат не работает, потому что каждый раз, когда вы вызываете myDAO.insertInTableX(), выполняется фиксация.

Чтобы удалить это поведение и ваш @Transactional работает правильно, добавьте:

spring.jpa.open-in-view=false

Для вашего application.properties

См. этот вопрос , чтобы узнать больше

0 голосов
/ 21 января 2019

Трудно сказать по количеству приведенного кода. Я знаю, что вам не нужно rollbackFor, если это RuntimeException. Те всегда откатываются. Я предполагаю, что ваша ошибка имени таблицы SQLException, которая реализует Exception. Вы должны иметь rollbackFor быть rollbackFor=SQLException.class, и я сохраню это только при проверке того, что произойдет откат. Добавляйте rollbackFor, только если вы генерируете отмеченные исключения в методах, вызываемых службой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...