2016-09-27 2 views
1

У нас есть несколько классов для записи и чтения из нашего уровня базы данных в режиме Command-Query-Separation.Run spring @Transactional аннотированные методы в одной транзакции

Каждый из этих классов аннотируется с @Transactional соответственно с @Transactional (readOnly = true).

Теперь мы реализовали импорт данных, который создает множество объектов и записывает их в базу данных с помощью нашего командного слоя.

На данный момент каждая запись одного объекта выполняется в рамках его собственной транзакции, и я уверен, что это крупный убийца по производительности.

Есть простой способ аннотировать класс импорта данных таким образом, что даже если он вызывает много @Transactional аннотированных методов в командном слое много раз, все было бы сделано в одной транзакции?

Является ли это даже действительным подходом для улучшения производительности вставки или вы считаете это плохой идеей?

+4

Просто аннотируйте родительский метод. Тот, который называет их всех. Выполнение всего этого в одной транзакции на самом деле было бы предпочтительнее, так как тогда вся партия будет выполнена вместе ... –

+0

Я уже пробовал это, казалось бы, без эффекта - не так ли, что метод \ @Transactional, который вызывает \ @Transactional метод из другого экземпляра, что автоматически приводит к созданию новой транзакции? – SebastianRiemer

+0

Зависит. В вашем методе в autwired через интерфейс? Вы используете плетение AspectJ? –

ответ

0

Ошибка Mistake: я использовал ExecutorService, поскольку я читал в этом сообщении. How to use spring transaction in multithread Spring не поддерживает многопоточность в сочетании с транзакциями.

Ошибка 2: я заменил службу ExecutorService, вызванную методом управляемого класса с аннотацией @Transactional напрямую, но на этот раз это не сработало, поскольку класс был вложен в вызывающий класс, поэтому он не рассматривался как вызвать «извне».

Смежные вопросы