Использование Spring @Transaction и @Async для операций с базой данных - PullRequest
0 голосов
/ 16 мая 2018

В приложении Spring, когда мы получаем сообщение, @Service persist bean вызывает операцию базы данных для вставки в базу данных и параллельную @Service для анализа и обработки сообщения.В этом случае при сохранении используется @Transactional.Для параллельного выполнения потока рекомендуется добавить @Async для постоянного хранения.

Кроме того, в каждом методе сохранения, вызываемом службой сохранения, для ведения журнала и аудита вызывается @Aspect.

  • Рекомендуется ли @Async для операций с базой данных?
  • Создает ли @Async блокировки таблиц?

1 Ответ

0 голосов
/ 16 мая 2018

Все, что делает @Async, - это заставляет методы аннотированного компонента выполняться в другом потоке, где он получает поток из пула (который может быть указан, поэтому вы можете выбрать для некоторых операций выделенный пул).

@ Сам Async ничего не делает для блокировки таблиц базы данных или чего-либо еще, связанного с базой данных.Если вам нужна блокировка на уровне базы данных, вам придется реализовать это другими способами.Если вы хотите, чтобы при вызове использовалась транзакция, вы должны использовать аннотацию @Transactional для компонента, вызываемого асинхронно.Транзакция будет отделена от транзакции звонящего.Конечно, транзакция может вызвать блокировку базы данных в зависимости от уровня изоляции и реализации базы данных.

Сложно использовать @Async для работы с базой данных.Одна ловушка происходит с постоянными сущностями jpa, передаваемыми через потоки, когда у них есть ленивое свойство, которое реализуется в новом потоке (где прокси-сервер теперь недопустим, потому что он не может добраться до entityManager из старого потока).Безопаснее, если вещи, передаваемые между потоками, неизменны.

@ Async добавляет сложности и трудно рассуждать.Существуют возможности для условий гонки и взаимоблокировок, где, если вы не понимаете это правильно, могут случиться плохие вещи, и вы не можете рассчитывать на тестирование для выявления проблем.Он работает без сети, если вы хотите, чтобы какая-либо инфраструктура помогла с обработкой исключений, повторными попытками или другим восстановлением, вам придется предоставить ее самостоятельно.

Так что нет, я бы не стал называть это целесообразным.Это хорошая возможность иметь в вашем наборе инструментов, которая может быть полезна для нескольких отдельных случаев, но широкое использование может показаться плохим.Есть альтернативы, если вы ищете способы сохранения данных без блокировки.

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