Руководство по прохождению собеседования по Java (Руководство по изучению Java):GitHub.com/snail Climb/…
Ссылка на адрес чтения WeChat:Вероятно, самое красивое подробное объяснение управления транзакциями Spring.
Обзор бизнес-концепции
Что такое транзакция?
Транзакция — это логический набор операций, либо все операции, либо ни одна из них.
Характеристики вещей (ACID):
- Атомарность:Транзакция является наименьшей единицей выполнения и не допускает разделения. Атомарность транзакций гарантирует, что действия либо завершатся, либо вообще ничего не сделают;
- последовательность:До и после выполнения транзакции данные остаются согласованными;
- Изоляция:При одновременном доступе к базе данных транзакция пользователя не нарушается другими транзакциями, а база данных независима от параллельных транзакций;
- Упорство:После совершения транзакции. Его изменения данных в базе данных являются постоянными, и даже если база данных выйдет из строя, это не должно на нее повлиять.
Введение в интерфейс управления транзакциями Spring
Интерфейс управления транзакциями Spring:
- Менеджер транзакций платформы:(Платформа) Менеджер транзакций
- Определение транзакции:Информация об определении транзакции (уровень изоляции транзакции, поведение распространения, время ожидания, доступ только для чтения, правила отката)
- Состояние транзакции:статус транзакции
Так называемое управление транзакциями на самом деле «выполняет операцию фиксации или отката в соответствии с заданными правилами транзакции».
Введение в интерфейс PlatformTransactionManager
Spring не управляет транзакциями напрямую, но предоставляет различные менеджеры транзакций., они делегируют ответственность за управление транзакциями транзакции соответствующей платформы платформы, обеспечиваемой механизмом сохраняемости, таким как Hibernate или JTA. Интерфейс менеджера транзакций Spring:org.springframework.transaction.PlatformTransactionManager, Через этот интерфейс Spring предоставляет соответствующие менеджеры транзакций для различных платформ, таких как JDBC, Hibernate и т. д., но конкретная реализация зависит от каждой платформы.
Код интерфейса PlatformTransactionManager выглядит следующим образом:
В интерфейсе PlatformTransactionManager определены три метода:
Public interface PlatformTransactionManager()...{
// Return a currently active transaction or create a new one, according to the specified propagation behavior(根据指定的传播行为,返回当前活动的事务或创建一个新事务。)
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// Commit the given transaction, with regard to its status(使用事务目前的状态提交事务)
Void commit(TransactionStatus status) throws TransactionException;
// Perform a rollback of the given transaction(对执行的事务进行回滚)
Void rollback(TransactionStatus status) throws TransactionException;
}
Мы только что сказали, что PlatformTransactionManager в Spring реализует классы в соответствии с интерфейсами, соответствующими различным платформам уровня сохраняемости.Некоторые из наиболее распространенных показаны на следующем рисунке.
Например, когда мы используем JDBC или iBatis (то есть Mybatis) для операций сохранения данных, наша конфигурация xml обычно выглядит следующим образом:
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
Введение в интерфейс TransactionDefinition
Интерфейс менеджера транзакцийPlatformTransactionManagerпройти черезgetTransaction(TransactionDefinition definition)метод для получения транзакции, параметры в этом методеКласс TransactionDefinition, этот класс определяет некоторые основные атрибуты транзакции.
Так что же такое атрибуты транзакции?
Атрибуты транзакций можно понимать как некоторые базовые конфигурации транзакций, описывающие, как политики транзакций применяются к методам. Атрибуты транзакции содержат 5 аспектов.
Методы в интерфейсе TransactionDefinition следующие:
Интерфейс TransactionDefinition определяет 5 методов и некоторые константы, представляющие свойства транзакции, такие как уровень изоляции, поведение распространения и т. д.
Ниже я перечисляю только методы в интерфейсе TransactionDefinition без указания констант, определенных в интерфейсе.Константная информация в интерфейсе будет представлена по очереди.
public interface TransactionDefinition {
// 返回事务的传播行为
int getPropagationBehavior();
// 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
int getIsolationLevel();
// 返回事务必须在多少秒内完成
//返回事务的名字
String getName();
int getTimeout();
// 返回是否优化为只读事务。
boolean isReadOnly();
}
(1) Уровень изоляции транзакции (который определяет степень, в которой транзакция может быть затронута другими параллельными транзакциями):
Давайте сначала посмотримПроблемы с одновременными транзакциями, а затем представитьИнтерфейс TransactionDefinitionСуществует пять констант, представляющих уровни изоляции, определенные в .
Проблемы с одновременными транзакциями
В типичном приложении несколько транзакций выполняются одновременно, часто работая с одними и теми же данными для выполнения соответствующих задач (несколько пользователей работают с унифицированными данными). Хотя параллелизм необходим, он может вызвать следующие проблемы.
-
Грязное чтение:Когда транзакция обращается к данным и вносит изменения в данные, а изменения не были зафиксированы в базе данных, другая транзакция также обращается к данным, а затем использует данные. Поскольку эти данные являются незафиксированными, данные, считанные другой транзакцией, являются «грязными данными», и операции, основанные на «грязных данных», могут быть неверными.
-
Потеряно для изменения:Это означает, что когда транзакция читает данные, другая транзакция также получает доступ к данным, а затем после изменения данных в первой транзакции вторая транзакция также изменяет данные. Таким образом, результат модификации в первой транзакции теряется, поэтому это называется потерянной модификацией.
Например: транзакция 1 считывает данные A=20 в таблице, транзакция 2 также считывает A=20, транзакция 1 изменяет A=A-1, транзакция 2 также изменяет A=A-1, окончательный результат A=19, транзакции 1 модификации теряются.
-
Неповторяемое чтение:Относится к чтению одних и тех же данных несколько раз в рамках транзакции. Пока эта транзакция не завершена, другая транзакция также обращается к данным. Затем между двумя чтениями данных в первой транзакции данные, дважды считанные первой транзакцией, могут не совпадать из-за модификации второй транзакции. Бывает такое, что данные, прочитанные дважды в транзакции, не совпадают, поэтому такое чтение называется неповторяющимся чтением.
-
Призрак читал:Фантомные чтения похожи на неповторяющиеся чтения. Это происходит, когда транзакция (T1) считывает несколько строк данных, а затем другая параллельная транзакция (T2) вставляет некоторые данные. В последующем запросе первая транзакция (T1) найдет еще несколько записей, которых не было, как будто произошла галлюцинация, поэтому она называется галлюцинацией.
Отличие неповторяемости от фантомного чтения:
Основное внимание при неповторяемом чтении уделяется изменению, а при фантомном чтении — добавлению или удалению.
Пример 1 (те же условия, данные вы прочитали, прочтите еще раз и обнаружите, что значение другое): Мистер А в транзакции 1 не завершил операцию чтения своей зарплаты в 1000, Мистер Б в транзакции 2 Это изменил зарплату А на 2000, в результате чего А прочитал свою зарплату как 2000; это неповторяемое чтение.
Пример 2 (те же условия, количество записей, прочитанных в первый и второй раз, разное): в поддельной таблице зарплаты 4 человека, чья зарплата больше 3000, и транзакция 1 читает всех людей, чья зарплата больше 3000. Всего найдено 4 записи.В это время транзакция 2 вставляет еще одну запись с зарплатой больше 3000. Когда транзакция 1 снова читает ее, найденных записей становится 5, что приводит к фантомному чтению.
уровень изоляции
В интерфейсе TransactionDefinition определены пять констант, представляющих уровни изоляции:
- TransactionDefinition.ISOLATION_DEFAULT:Используйте уровень изоляции по умолчанию для серверной базы данных, уровень изоляции REPEATABLE_READ, принятый Mysql по умолчанию, и уровень изоляции READ_COMMITTED, принятый Oracle по умолчанию.
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED:Самый низкий уровень изоляции, позволяющий читать изменения данных, которые еще не были зафиксированы,Может вызвать грязное чтение, фантомное чтение или неповторяющееся чтение.
- TransactionDefinition.ISOLATION_READ_COMMITTED:Позволяет читать данные, которые были зафиксированы параллельными транзакциями,Грязные чтения можно предотвратить, но фантомные или неповторяющиеся чтения все же могут происходить.
- TransactionDefinition.ISOLATION_REPEATABLE_READ:Результаты многократного чтения одного и того же поля согласуются, если только данные не изменены самой транзакцией.Грязные чтения и неповторяющиеся чтения можно предотвратить, но фантомные чтения все еще могут возникать.
- TransactionDefinition.ISOLATION_SERIALIZABLE:Самый высокий уровень изоляции, полностью соответствующий уровню изоляции ACID. Все транзакции выполняются одна за другой, так что абсолютно исключена возможность вмешательства между транзакциями, т.е.Этот уровень предотвращает грязные чтения, неповторяемые чтения и фантомные чтения.. Но это серьезно повлияет на производительность программы. Обычно этот уровень также не используется.
Вы чувствуете, что клеток мозга недостаточно, Хашимото Нана не знал об этом~~~ Ян Чжи против неба! ! !
(2) Поведение при распространении транзакций (чтобы решить проблему транзакций при вызове друг друга между методами бизнес-уровня):
Когда метод транзакции вызывается другим методом транзакции, вы должны указать, как транзакция должна распространяться. Например: метод может продолжать выполняться в существующей транзакции или может запускать новую транзакцию и выполняться в своей собственной транзакции. Следующие константы, представляющие поведение распространения, включены в определение TransactionDefinition:
Ситуации, поддерживающие текущую транзакцию:
- TransactionDefinition.PROPAGATION_REQUIRED:Если транзакция в настоящее время существует, присоединитесь к транзакции, если текущей транзакции нет, создайте новую транзакцию.
- TransactionDefinition.PROPAGATION_SUPPORTS:Если в данный момент есть транзакция, присоединиться к транзакции; если текущей транзакции нет, продолжить работу в нетранзакционном режиме.
- TransactionDefinition.PROPAGATION_MANDATORY:Если в данный момент есть транзакция, присоединиться к транзакции; если текущей транзакции нет, сгенерировать исключение. (обязательно: обязательно)
Когда текущая транзакция не поддерживается:
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:Создайте новую транзакцию и приостановите текущую транзакцию, если есть текущая транзакция.
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:Запустите в нетранзакционном режиме, приостановите текущую транзакцию, если текущая транзакция есть.
- TransactionDefinition.PROPAGATION_NEVER:Работает без транзакций и выдает исключение, если транзакция уже существует.
Другие случаи:
- TransactionDefinition.PROPAGATION_NESTED:Если транзакция в настоящее время существует, создайте транзакцию для выполнения как вложенную транзакцию текущей транзакции; если текущей транзакции нет, значение эквивалентно TransactionDefinition.PROPAGATION_REQUIRED.
Здесь следует отметить, что предыдущие шесть способов распространения транзакций введены Spring из EJB, и они имеют одну и ту же концепцию. иPROPAGATION_NESTEDспецифичен для весны. Транзакция, начатая с PROPAGATION_NESTED, встроена во внешнюю транзакцию (если есть внешняя транзакция), в настоящее время встроенная транзакция не является независимой транзакцией, она зависит от существования внешней транзакции, только через фиксацию внешней транзакции, может ли внутренняя транзакция быть вызвана фиксацией транзакций, вложенные подтранзакции не могут быть зафиксированы по отдельности. Если вы знакомы с концепцией точек сохранения в JDBC, вложенные транзакции легко понять. Фактически, вложенные подтранзакции являются приложением точек сохранения. Транзакция может включать несколько точек сохранения, и каждая вложенная подтранзакция является приложением точек сохранения. , субтранзакция. Кроме того, откат внешней транзакции также вызовет откат вложенных подтранзакций.
(3) Атрибут времени ожидания транзакции (максимальное время, в течение которого транзакция может выполняться)
Так называемый тайм-аут транзакции относится к максимальному времени, разрешенному для выполнения транзакции.Если лимит времени превышен, но транзакция не была завершена, транзакция будет автоматически отменена. В TransactionDefinition тайм-аут представлен значением int, единицей измерения которого являются секунды.
(4) Атрибут транзакции только для чтения (выполнять ли операции только для чтения с ресурсами транзакции)
Атрибут транзакции только для чтения относится к операции только для чтения или операции чтения-записи в транзакционном ресурсе. Так называемые транзакционные ресурсы относятся к тем ресурсам, которые управляются транзакциями, например к источникам данных, ресурсам JMS и пользовательским транзакционным ресурсам. Если определено, что над транзакционными ресурсами выполняются только операции только для чтения, то мы можем пометить транзакцию как доступную только для чтения, чтобы повысить производительность обработки транзакций. В TransactionDefinition логический тип указывает, доступна ли транзакция только для чтения.
(5) Правила отката (определение правил отката транзакций)
Эти правила определяют, какие исключения вызовут откат транзакции, а какие нет. По умолчанию транзакция будет откатываться только в том случае, если она сталкивается с исключением во время выполнения, и не будет откатываться, если она сталкивается с проверенным исключением (это поведение согласуется с поведением отката EJB). Но вы можете объявить, что транзакция откатывается, когда сталкивается с определенными проверенными исключениями, как если бы это было исключение времени выполнения. Точно так же вы также можете объявить, что транзакция не будет откатываться при определенных исключениях, даже если эти исключения являются исключениями времени выполнения.
Введение в интерфейс TransactionStatus
Интерфейс TransactionStatus используется для записи состояния транзакции.Этот интерфейс определяет набор методов для получения или оценки соответствующей информации о состоянии транзакции.
Метод PlatformTransactionManager.getTransaction(…) возвращает объект TransactionStatus. Возвращенный объект TransactionStatus может представлять новую или существующую транзакцию (если в текущем стеке вызовов есть подходящая транзакция).
Содержимое интерфейса TransactionStatus следующее:
public interface TransactionStatus{
boolean isNewTransaction(); // 是否是新的事物
boolean hasSavepoint(); // 是否有恢复点
void setRollbackOnly(); // 设置为只回滚
boolean isRollbackOnly(); // 是否为只回滚
boolean isCompleted; // 是否已完成
}
Из-за ограниченного места я представлю программные и декларативные транзакции Spring на примерах передачи в следующей статье.
Добро пожаловать в мой публичный аккаунт WeChat:«Руководство по прохождению собеседования по Java»(Теплая публичная учетная запись WeChat, с нетерпением ожидающая прогресса вместе с вами ~~~ настаивайте на оригинальности, делитесь красивыми текстами и делитесь различными учебными ресурсами Java):