Глубокое понимание механизма управления транзакциями Spring boot: освоить несколько вариантов поведения распространения, уровней изоляции и механизмов отката транзакций Spring, а также понять применение АОП в управлении транзакциями.
Глубокое понимание механизма управления транзакциями Spring boot: освоить несколько вариантов поведения распространения, уровней изоляции и механизмов отката транзакций Spring, а также понять применение АОП в управлении транзакциями.
представлять
1.1 Spring управление транзакциямиважность
существуют в приложении,управление транзакциями является важной частью обеспечения согласованности и целостности данных. Весна управление транзакциями предоставил Надежный и гибкий способ управления делами, обеспечивающий существованиебазы данных Атомность во время операций、последовательность、Изоляция и постоянство.
Важность Spring управления транзакциями включает в себя:
база данныхпоследовательность:проходитьуправление транзакциями,Может обеспечить атомарность операций базы данных.,То есть либо все операции выполняются успешно,Или откатить все назад,чтобы сохранить данныепоследовательность。
Обработка ошибок и откат: управление транзакциями позволяет откатить дела при возникновении ошибки в существовании,Обеспечьте целостность данных,И существуют соответствующая обработка ошибок в нештатных ситуациях.
Управление параллелизмом: определить соответствующий уровень изоляции,управление транзакциями можно обрабатывать базу с одновременным доступом Вопросы о данных,Избегайте конфликтов и несоответствий данныхпоследовательность。
Масштабируемость и гибкость: Spring управление транзакциями предоставлены разнообразные варианты конфигурации и методы программирования, которые можно гибко настраивать и управлять ими в соответствии с потребностями приложения.
1.2 Цели и объем
Spring управление Цель транзакций — обеспечить базу в существующем приложении. В ходе эксплуатации данных могут быть достигнуты следующие цели:
Атомарность: Все операции в делах либо успешно выполняются, либо отправляются.,Либо провалить все и откатиться назад,убеждатьсябаза данныхизпоследовательность。
последовательность(Consistency):делаиз Процесс исполнениясередина,переход базы данных из одного согласованного состояния в другое согласованное состояние,Целостность данных не будет нарушена.
Изоляция: несколько одновременных транзакций должны быть изолированы друг от друга.,Каждая операция дела должна выглядеть как существование, выполняемая независимо.,Избегайте конфликтов и несоответствий данныхпоследовательность。
Долговечность: После отправки дела,Его изменения в базе данных должны быть постоянными.,Его можно восстановить даже в случае сбоя или перезагрузки системы.
Spring управление транзакциямииз Объем включает в себя:
Поддерживает различные способы управления транзакциями Способ:Spring предоставил Различныйуправление транзакциями, включая программное управление транзакциямии декларативныйуправление транзакциями для адаптации к различным сценариям применения и потребностям разработки.
Интегрируйте различные средства управления транзакциямиустройство:Spring Может использоваться с различными типами управления. интеграция транзакций с серверами, в том числе нативная JDBC дела、JTA Распределенные дела, Hibernate дела и т. д. для работы с различными фреймворками и базами персистентности данныхвзаимодействовать.
Предоставьте аннотации и XML Поддержка конфигурации: Spring Разрешить использование аннотаций или XML Способ конфигурации для определения и управления делами, создание управления транзакциями более гибко и удобно.
Основы весенних транзакций
2.1 Обзор транзакций
Транзакция Spring — это логическая единица набора операций с базой данных, которая является атомарной и согласованной. Транзакция состоит из последовательности операций, которые либо все выполняются успешно и фиксируются, либо все они терпят неудачу и откатываются.
Ключевые концепции транзакций Spring включают в себя:
управление транзакциямиустройство(Transaction Manager):управление транзакциямиустройствода Spring Предоставляет интерфейс для управления операциями запуска, фиксации и отката дел. Это связано с базовой базой данных или структуры персистентности для взаимодействия и обеспечения правильного выполнения дел.
дела Определение (Транзакция Определение): определение дела определяет атрибуты дела, такие как уровень. изоляции、коммуникативное поведение, настройки тайм-аута и т. д. Его можно определить программно или декларативно.
деластатус (Транзакция Status):дела Статус указывает текущийделаизсостояние,В том числе зафиксированные, откаченные или находящиеся в процессе выполнения. вести статус,Делами можно управлять и контролировать.
Сделка Аспект): Аспект — это набор логики и функций, связанных с приложением в приложении. Его можно определить и применить программно или декларативно.
2.2 управление транзакциямиустройство
существовать Spring середина,управление транзакциямиустройство(Transaction Менеджер) — ключевой компонент управления делами. управление Сервер транзакций отвечает за запуск, фиксацию и откат операций и взаимодействует с базовой базой. данныхили структура персистентностивзаимодействовать.
Spring обращения Различные реализации управления транзакциями, в том числе:
DataSourceTransactionManager: используется для управления на основе JDBC дела, с JDBC DataSource взаимодействовать.
JpaTransactionManager: используется для управления на основе JPA(Java Persistence API)дела, с JPA EntityManagerFactory взаимодействовать.
HibernateTransactionManager: используется для управления на основе Hibernate дела, с Hibernate SessionFactory взаимодействовать.
JtaTransactionManager: используется для управления распределенными транзакциями при взаимодействии с JTA (Java Transaction API).
Вы можете выбрать подходящее управление транзакциями на основе структуры персистентности, используемой приложением.
2.3 Определение транзакции и аннотации
существовать Spring , определение транзакции (Транзакция Определение) используется для определения атрибутов дела, таких как уровень изоляции、коммуникативное поведение, настройки тайм-аута и т. д. Определения дел могут быть определены программно или декларативно.
Программное определение дел предполагает написание кода для явного управления запуском, фиксацией и откатом дел. Вы можете использовать API программного управления транзакциями (например, TransactionTemplate) для определения свойств транзакции.
Декларативное определение дела проводитсясуществовать на уровне метода или класса с использованием аннотаций или XML Конфигурация для определения свойств транзакции. Весна предоставил @Transactional Аннотация, используемая для определения свойств дела на уровне существования метода. Вы можете существовать необходимость осуществлять управление Добавляем метод транзакций @Transactional Аннотируйте и указывайте свойства транзакции.
делаизсвойствовключатькоммуникативное поведение(Propagation)、уровень изоляции(Isolation)、Флаг ReadOnly (ReadOnly)、Настройки тайм-аута(Timeout)ждать。проходитьчетко определенныйизделасвойство,Вы можете контролировать поведение и характеристики дел.
Например, ниже приведен пример использования @Transactional Пример аннотации, определяющей транзакцию:
Если вы в настоящее время экономите существованиядела,Затем присоединяйтесь к делам для исполнения.
Если в данный момент дел нет, создайте новое выполнение дел.
Это поведение распространения Spring по умолчанию.
2. REQUIRES_NEW поведение распространения
всегда создавай новые дела,И повесить текущие дела (если существуют, сохранить).
существуют Новый метод исполнения дел,Не подвержен внешним воздействиям.
3. ПОДДЕРЖИВАЕТ коммуникативное поведение
Если вы в настоящее время экономите существованиядела,Затем присоединяйтесь к делам для исполнения.
Если в данный момент нет дел,Тогда оно выполняется неделанным способом.
4. NOT_SUPPORTED поведение распространения
Методы всегда выполняются неделанным способом.
Если вы в настоящее время экономите существованиядела,затем приостановите его.
5. ОБЯЗАТЕЛЬНОЕ коммуникативное поведение
Если вы в настоящее время экономите существованиядела,Затем присоединяйтесь к делам для исполнения.
Если в данный момент нет дел,Выдается исключение.
6. НИКОГДА не коммуникативное поведение
Методы всегда выполняются неделанным способом.
Если вы в настоящее время экономите существованиядела,Выдается исключение.
уровень изоляции
1. READ_UNCOMMITTED уровень изоляции
самый низкий уровень запуск, что позволяет выполнять грязные чтения, неповторяемые чтения и фантомные чтения.
Одно дело может читать незафиксированные данные другого дела.
2. READ_COMMITTED уровень изоляции
Гарантируется, что данные, измененные одним делом, могут быть прочитаны другим делом после их отправки.
Избегайте грязного чтения, однако неповторяющиеся чтения и фантомные чтения все равно могут произойти.
3. REPEATABLE_READ уровень изоляции
Гарантируется, что одно дело не сможет прочитать незафиксированные данные другого дела.
Избегайте грязного чтения и неповторяющегося чтения, однако фантомное чтение все равно может произойти.
4. SERIALIZABLE уровень изоляции
Самый высокий уровень запуск, гарантирующий, что грязные чтения, неповторяемые чтения и фантомные чтения не будут происходить ни при каких обстоятельствах.
дела обрабатываются как последовательное выполнение,Избегайте одновременных операций чтения и записи.
Принципы дела
аоп/динамический прокси
Абстракция транзакции Spring включает три основных интерфейса: PlatformTransactionManager, TransactionDefinition и TransactionStatus.
PlatformTransactionManager отвечает за определение границ дел.,Он определяет, когда дела начинаются и заканчиваются.
TransactionDefinition отвечает за определение атрибутов дела, включая уровень. изоляции、коммуникативное поведение и др. Это помогло возможности детально настроить дела.
PlatformTransactionManager открывает соответствующую транзакцию на основе определения атрибута TransactionDefinition. От начала и до конца существования дела TransactionStatus отвечает за отслеживание и управление статусом дела. применитьTransactionStatus, мы имеем ограниченный контроль над делами.
Обычно используемые реализации TransactionDefinition включают DefaultTransactionDefinition и TransactionTemplate. Эти два в основном используются в сценариях программных дел. Кроме того, существуют DefaultTransactionAttribute и RuleBasedTransactionAttribute, которые в основном используются для Spring-приложений. Декларативное управление АОП сцена с транзакциями. RuleBasedTransactionAttribute позволяет одновременно указать несколько правил отката.
Распространенной реализацией TransactionStatus является DefaultTransactionStatus, которая используется для записи информации о статусе дел.
Реализацию PlatformTransactionManager можно разделить на две ветви: ориентированную на локальные дела и ориентированную на глобальные дела. Обычно используемые частичные реализации включают DataSourceTransactionManager (для JDBC и MyBatis) и HibernateTransactionManager. Они ориентированы на функциональность конкретной структуры персистентности.
управление транзакциями
Для программатикуправление транзакциями:
Используйте TransactionTemplate или напрямую используйте базовый PlatformTransactionManager для работы.
Логику управления транзакциями необходимо явно писать в коде.
Запуск, фиксацию и откат дел необходимо выполнять вручную.
Логика управления дела тесно связана с бизнес-логикой, что приводит к снижению читаемости и удобства сопровождения кода.
Можно реализовать управление транзакциями на более детальном уровне блоков кода.
Для декларативногоуправление транзакциями:
Основанный на существующем AOP (аспектно-ориентированном программировании), метод перехватывает выполнение до и после целевого метода для реализации управления. транзакциями。
применить файл конфигурации или объявить правила дела на основе аннотации @Transactional.
Нет необходимости писать код управления транзакциями в коде бизнес-логики, чтобы поддерживать чистоту бизнес-кода.
Логика управления дела отделена от бизнес-логики, что повышает читаемость и удобство сопровождения кода.
Самая тонкая детализация работает только на уровне метода.,Невозможно применить непосредственно к уровню блока кода.,Но можно добиться подобных эффектов за счет детализации метода введения.
Пример
Предположим, у нас есть система банковских счетов, которая предполагает операции перевода между двумя счетами. Нам необходимо обеспечить атомарность операции перевода, то есть либо суммы двух счетов изменяются одновременно, либо они не меняются вообще. .
Во-первых, нам нужно использовать транзакции базы данных, чтобы обеспечить согласованность операций передачи. Предполагая, что мы используем среду Spring для управления транзакциями, код будет следующим:
Язык кода:javascript
копировать
@Transactional
public void transferAmount(String fromAccount, String toAccount, double amount) {
try {
// 1. Проверить баланс переведенного счета
double fromBalance = accountDao.getBalance(fromAccount);
// 2. Проверить баланс переведенного счета
double toBalance = accountDao.getBalance(toAccount);
// 3. Определить, достаточен ли баланс на переведенном счете
if (fromBalance < amount) {
throw new InsufficientBalanceException("Insufficient balance in the source account.");
}
// 4. Списать сумму перевода со счета
accountDao.updateBalance(fromAccount, fromBalance - amount);
// 5. Увеличение суммы перевода на счет
accountDao.updateBalance(toAccount, toBalance + amount);
// 6. представлять на рассмотрениедела } catch (Exception e) {
// 7. Возникает исключение, откат дела
throw new TransferException("Error occurred during the transfer.", e);
}
}
Мы используем аннотацию @Transactional, чтобы указать, что метод необходимо выполнить в существующем деле. Внутри существующего метода мы выполняем следующие шаги для выполнения операции переноса:
Проверьте баланс переведенного счета.
Проверьте баланс переведенного счета.
Определите, достаточен ли баланс перенесенного аккаунта, и если нет, выдайте исключение.
Снять сумму, переведенную со счета.
Увеличьте сумму, переведенную на счет.
существовать Нет.6перед шагом,Если возникает исключение,Перейду к шагу 7,То есть блок кода для обработки исключений. Блок обработки исключений,Мы выбрасываем собственное TransferException,и использоватьthrowОператор будет продолжать выдавать исключения。это вызоветSpringуправление Механизм отката сервера транзакциями, приводящий к предыдущей базе Операция с данными отменяется, тем самым возвращаясь к состоянию до начала дел.
применить механизм отката,Если в процессе передачи возникает исключение,Например, баланс на переводном счете недостаточен.,Все операции с базой данных будут отменены.,убеждатьсяданныеизпоследовательность。Это позволяет избежать процесса передачисерединаданные发生不一致из Состояние。
проходить Pointcut Отфильтровано по точке завершения транзакции Бин создаст прокси-объект, Бин Определенно определено внутри @Transactional Аннотация, если она определена в классе @Transactional Обратите внимание: каждый метод требует обработки дела. дела перехвата, обработки прокси-объектов существуют TransactionInterceptor В перехватчике это реализовано MethodInterceptor Перехватчик метода, то есть реализованный Object invoke(MethodInvocation invocation) Давайте рассмотрим этот метод TransactionInterceptor этот класс