@ Транзакционный сервисный метод, два DAO реализованы из параметризованного интерфейса - PullRequest
0 голосов
/ 21 мая 2019

Я не могу откатить транзакцию в Spring Boot 2.1.4 с участием двух DAO (JDBC).DAO реализуют параметризованный интерфейс.Первый DAO вставляет запись в три таблицы, а последний DAO вставляет запись в одну таблицу.Я заставляю последнюю вставку DAO терпеть неудачу.

База данных - DB2.

Некоторый код:

public interface FooDao<T extends Foo> {
    int insert(T foo) throws SQLException;
}

@Repository
public class FooDaoJdbc implements FooDao {
    @Override
    public int insert(Foo foo) throws SQLException {
        insertFoo(foo);
        insertFooDescriptions(foo);
        insertFooActivity(foo);
        return 0;
    }
}

@Repository
public class BazDaoJdbc implements FooDao<Baz>  {
    @Override
    public int insert(Baz baz) throws SQLException {

public interface FooService<T extends Foo> {
    void add(T foo) throws SQLException;
}

@Service
public class BazServiceImpl implements FooService<Baz> {

    private FooDao<Baz> bazDaoJdbc;

    private FooDao<Foo> fooDaoJdbc;

    @Transactional(rollbackFor = Exception.class)
    public void add(Baz baz) throws SQLException {
                fooDaoJdbc.insert(foo);
        bazDaoJdbc.insert(baz);        
        }
}

Кажется, что FooDaoJdbc и BazDaoJdbc находятся в одной транзакции, когда я отлаживаю TransactionAspectSupport, но откат кажетсяигнорировать FooDaoJdbc.У меня нет записи в таблице «baz», но я ожидаю, что три таблицы «foo» также откатятся.Мои глаза скрещены в этой точке.У меня есть неуместная аннотация?Я делаю вещи слишком "причудливыми" с дженериками?Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 21 мая 2019

A @Transactional метод отката только при возникновении непроверенного исключения.Таким образом, вы должны бросить RuntimeException в методе add при возникновении исключения.

@Service
public class BazServiceImpl implements FooService<Baz> {

    private FooDao<Baz> bazDaoJdbc;

    private FooDao<Foo> fooDaoJdbc;

@Transactional
    public void add(Baz baz) {
     try {
            fooDaoJdbc.insert(foo);
            bazDaoJdbc.insert(baz);   
        } catch (Exception e) {
         throw new RuntimeException(e.getMessage());
        }     
    }
}

Дополнительная информация: https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/

...