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

Зачем нужны транзакции?

Начнем с примера сохранения информации о заказе. Во многих случаях для хранения информации о заказе у нас есть две таблицы, позволяющие вызывать Order и OrderLine. Следовательно, система должна сначала сохранить данные для заказа, а затем отсортировать информацию по позициям заказа. Теперь нужно подумать о случае, когда мы успешно сохраняем данные заказа, но OrderLine не удалось. В этом случае мы должны откатить информацию о заказе, чтобы она не сохранялась в базе данных, чтобы гарантировать непротиворечивость информации о заказе. В таких задачах мы должны использовать транзакции.

Преимущества использования транзакционной аннотации

Уменьшите код кипячения

В java или других языках разработчик часто помещает операции в блок try-catch. Смотрим на фрагмент кода ниже.

Фактически, система может содержать тысячу методов, обернутых в контекст транзакции, поэтому мы также должны повторить тысячу блоков try-catch.

Предотвращение ошибок

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

Приятно читать код в декларативном стиле

Представьте, что вам нужно провести рефакторинг или прочитать существующие методы для исследования некоторых проблем или бизнес-журнал с этими кодами для всех служб или логического класса. Ужасно, правда?

С аннотацией транзакций нам нужна только одна строка кода. Прохладный! правильно?

Где мы должны разместить аннотацию Transactional?

Есть несколько точек зрения на это, но, на мой взгляд, мы должны поместить это на уровень обслуживания. Почему? На уровне сервиса нам разрешено обрабатывать больше типов исключений и вызывать несколько методов DAO. Следовательно, это позволяет откатить все действия по сохранению, тогда как методы DAO. И следуйте принципу единой ответственности, мы не должны вводить сложную логику или обрабатывать слишком много вещей.

На уровне контроллера! О, я видел, как некоторые разработчики помещали аннотацию Transactional на уровень контроллера, но я не думаю, что это хорошая идея.

Что такое org.springframework.transaction.annotation.Transactional

Я использую полное имя, чтобы не путать с javax.transaction.Transactional. Не путайте.

Аннотации Spring Transactional имеют список свойств, которые позволяют лучше контролировать транзакцию.

  • value или transactionManager → укажите конкретного менеджера транзакций. Очень полезно, если у нас несколько менеджеров транзакций.
  • noRollbackFor и noRollbackForClassName используются для указания нуля или более исключений, которые не вызывают откат транзакции. Это означает, что не откатывать, если возникли эти исключения.
  • rollbackFor и rollbackForClassName используются для отката транзакции для указанного типа исключения.
  • изоляция → Укажите уровень изоляции.

Вывод

К настоящему времени мы узнали, зачем нам нужна транзакция и преимущества использования аннотации транзакций. И мы ввели несколько свойств, поддерживаемых транзакционной аннотацией.

использованная литература