Глубокое понимание механизма управления транзакциями 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 Пример аннотации, определяющей транзакцию:

Язык кода:javascript
копировать
@Transactional(propagation = Propagation.REQUIRED,изоляция = Изоляция.DEFAULT)
общественная недействительность PerformTransaction () {
    // деладействовать
}

роль транзакции

Конфигурация, связанная с транзакцией

поведение распространения транзакций

1. ОБЯЗАТЕЛЬНОЕ коммуникативное поведение
  • Если вы в настоящее время экономите существованиядела,Затем присоединяйтесь к делам для исполнения.
  • Если в данный момент дел нет, создайте новое выполнение дел.
  • Это поведение распространения 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. Они ориентированы на функциональность конкретной структуры персистентности.

управление транзакциями

Для программатикуправление транзакциями:

  1. Используйте TransactionTemplate или напрямую используйте базовый PlatformTransactionManager для работы.
  2. Логику управления транзакциями необходимо явно писать в коде.
  3. Запуск, фиксацию и откат дел необходимо выполнять вручную.
  4. Логика управления дела тесно связана с бизнес-логикой, что приводит к снижению читаемости и удобства сопровождения кода.
  5. Можно реализовать управление транзакциями на более детальном уровне блоков кода.

Для декларативногоуправление транзакциями:

  1. Основанный на существующем AOP (аспектно-ориентированном программировании), метод перехватывает выполнение до и после целевого метода для реализации управления. транзакциями。
  2. применить файл конфигурации или объявить правила дела на основе аннотации @Transactional.
  3. Нет необходимости писать код управления транзакциями в коде бизнес-логики, чтобы поддерживать чистоту бизнес-кода.
  4. Логика управления дела отделена от бизнес-логики, что повышает читаемость и удобство сопровождения кода.
  5. Самая тонкая детализация работает только на уровне метода.,Невозможно применить непосредственно к уровню блока кода.,Но можно добиться подобных эффектов за счет детализации метода введения.

Пример

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

Во-первых, нам нужно использовать транзакции базы данных, чтобы обеспечить согласованность операций передачи. Предполагая, что мы используем среду 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, чтобы указать, что метод необходимо выполнить в существующем деле. Внутри существующего метода мы выполняем следующие шаги для выполнения операции переноса:

  1. Проверьте баланс переведенного счета.
  2. Проверьте баланс переведенного счета.
  3. Определите, достаточен ли баланс перенесенного аккаунта, и если нет, выдайте исключение.
  4. Снять сумму, переведенную со счета.
  5. Увеличьте сумму, переведенную на счет.

существовать Нет.6перед шагом,Если возникает исключение,Перейду к шагу 7,То есть блок кода для обработки исключений. Блок обработки исключений,Мы выбрасываем собственное TransferException,и использоватьthrowОператор будет продолжать выдавать исключения。это вызоветSpringуправление Механизм отката сервера транзакциями, приводящий к предыдущей базе Операция с данными отменяется, тем самым возвращаясь к состоянию до начала дел.

применить механизм отката,Если в процессе передачи возникает исключение,Например, баланс на переводном счете недостаточен.,Все операции с базой данных будут отменены.,убеждатьсяданныеизпоследовательность。Это позволяет избежать процесса передачисерединаданные发生不一致из Состояние。

Обработка перехвата транзакций TransactionInterceptor

проходить Pointcut Отфильтровано по точке завершения транзакции Бин создаст прокси-объект, Бин Определенно определено внутри @Transactional Аннотация, если она определена в классе @Transactional Обратите внимание: каждый метод требует обработки дела. дела перехвата, обработки прокси-объектов существуют TransactionInterceptor В перехватчике это реализовано MethodInterceptor Перехватчик метода, то есть реализованный Object invoke(MethodInvocation invocation) Давайте рассмотрим этот метод TransactionInterceptor этот класс

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose