Весна - Управление транзакциями
Транзакция базы данных - это последовательность действий, которые рассматриваются как единая единица работы. Эти действия должны быть либо завершены полностью, либо не иметь никакого эффекта. Управление транзакциями - важная часть корпоративного приложения, ориентированного на СУБД, которое обеспечивает целостность и согласованность данных. Концепция транзакций может быть описана следующими четырьмя ключевыми свойствами, описываемыми какACID -
Atomicity - Транзакция должна рассматриваться как единая операция, что означает, что либо вся последовательность операций успешна, либо неуспешна.
Consistency - Это представляет собой согласованность ссылочной целостности базы данных, уникальных первичных ключей в таблицах и т. Д.
Isolation- Одновременно может выполняться много транзакций с одним и тем же набором данных. Каждая транзакция должна быть изолирована от других, чтобы предотвратить повреждение данных.
Durability - После завершения транзакции результаты этой транзакции должны быть постоянными и не могут быть удалены из базы данных из-за сбоя системы.
Настоящая СУБД гарантирует все четыре свойства для каждой транзакции. Упрощенный вид транзакции, отправляемой в базу данных с использованием SQL, выглядит следующим образом:
Начните транзакцию с помощью команды begin transaction .
Выполняйте различные операции удаления, обновления или вставки с помощью SQL-запросов.
Если все операции выполнены успешно, выполните фиксацию, иначе откатите все операции.
Инфраструктура Spring предоставляет абстрактный уровень поверх различных базовых API-интерфейсов управления транзакциями. Поддержка транзакций Spring направлена на предоставление альтернативы транзакциям EJB путем добавления транзакционных возможностей к POJO. Spring поддерживает как программное, так и декларативное управление транзакциями. Для EJB-компонентов требуется сервер приложений, но управление транзакциями Spring может быть реализовано без необходимости в сервере приложений.
Локальные и глобальные транзакции
Локальные транзакции специфичны для одного транзакционного ресурса, такого как соединение JDBC, тогда как глобальные транзакции могут охватывать несколько транзакционных ресурсов, таких как транзакция в распределенной системе.
Локальное управление транзакциями может быть полезно в централизованной вычислительной среде, где компоненты и ресурсы приложения расположены на одном сайте, а управление транзакциями включает только локальный менеджер данных, работающий на одной машине. Реализовать локальные транзакции проще.
Глобальное управление транзакциями требуется в распределенной вычислительной среде, где все ресурсы распределены по нескольким системам. В таком случае управление транзакциями должно осуществляться как на локальном, так и на глобальном уровнях. Распределенная или глобальная транзакция выполняется в нескольких системах, и ее выполнение требует координации между глобальной системой управления транзакциями и всеми локальными менеджерами данных всех задействованных систем.
Программные и декларативные продажи
Spring поддерживает два типа управления транзакциями -
Программное управление транзакциями - это означает, что вы должны управлять транзакцией с помощью программирования. Это дает вам чрезвычайную гибкость, но его сложно поддерживать.
Декларативное управление транзакциями - это означает, что вы отделяете управление транзакциями от бизнес-кода. Вы используете только аннотации или конфигурацию на основе XML для управления транзакциями.
Декларативное управление транзакциями предпочтительнее программного управления транзакциями, хотя оно менее гибкое, чем программное управление транзакциями, которое позволяет вам контролировать транзакции с помощью вашего кода. Однако декларативное управление транзакциями может быть разделено на модули с помощью подхода АОП. Spring поддерживает декларативное управление транзакциями через платформу Spring AOP.
Абстракции Spring Transaction
Ключ к абстракции транзакции Spring определяется интерфейсом org.springframework.transaction.PlatformTransactionManager , который выглядит следующим образом:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Старший Нет | Метод и описание |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) Этот метод возвращает текущую активную транзакцию или создает новую в соответствии с указанным поведением распространения. |
2 | void commit(TransactionStatus status) Этот метод фиксирует данную транзакцию с учетом ее статуса. |
3 | void rollback(TransactionStatus status) Этот метод выполняет откат данной транзакции. |
TransactionDefinition является основным интерфейсом поддержки транзакций в Spring и определяются следующим образом: -
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
Старший Нет | Метод и описание |
---|---|
1 | int getPropagationBehavior() Этот метод возвращает поведение распространения. Spring предлагает все варианты распространения транзакций, знакомые по EJB CMT. |
2 | int getIsolationLevel() Этот метод возвращает степень, в которой эта транзакция изолирована от работы других транзакций. |
3 | String getName() Этот метод возвращает имя этой транзакции. |
4 | int getTimeout() Этот метод возвращает время в секундах, в течение которого транзакция должна завершиться. |
5 | boolean isReadOnly() Этот метод возвращает, доступна ли транзакция только для чтения. |
Ниже приведены возможные значения уровня изоляции -
Старший Нет | Изоляция и описание |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT Это уровень изоляции по умолчанию. |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED Указывает, что грязное чтение предотвращено; могут происходить неповторяющиеся чтения и фантомные чтения. |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED Указывает, что могут происходить грязные, неповторяющиеся чтения и фантомные чтения. |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ Указывает, что грязное чтение и неповторяющееся чтение предотвращены; могут происходить фантомные чтения. |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE Указывает, что грязное чтение, неповторяющееся чтение и фантомное чтение предотвращены. |
Ниже приведены возможные значения для типов распространения -
Sr. No. | Распространение и описание |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY Поддерживает текущую транзакцию; выдает исключение, если текущая транзакция не существует. |
2 | TransactionDefinition.PROPAGATION_NESTED Выполняется во вложенной транзакции, если существует текущая транзакция. |
3 | TransactionDefinition.PROPAGATION_NEVER Не поддерживает текущую транзакцию; выдает исключение, если существует текущая транзакция. |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED Не поддерживает текущую транзакцию; скорее всегда выполняются нетранзакционным образом. |
5 | TransactionDefinition.PROPAGATION_REQUIRED Поддерживает текущую транзакцию; создает новый, если его нет. |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW Создает новую транзакцию, приостанавливая текущую транзакцию, если таковая существует. |
7 | TransactionDefinition.PROPAGATION_SUPPORTS Поддерживает текущую транзакцию; выполняется без транзакций, если таковой не существует. |
8 | TransactionDefinition.TIMEOUT_DEFAULT Использует тайм-аут по умолчанию базовой системы транзакций или не использует, если тайм-ауты не поддерживаются. |
Интерфейс TransactionStatus обеспечивает простой способ для кода транзакции управлять выполнением транзакции и запрашивать статус транзакции.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
Sr. No. | Метод и описание |
---|---|
1 | boolean hasSavepoint() Этот метод возвращает, содержит ли эта транзакция внутреннюю точку сохранения, т. Е. Была ли создана как вложенная транзакция на основе точки сохранения. |
2 | boolean isCompleted() Этот метод возвращает, завершена ли эта транзакция, т. Е. Была ли она уже зафиксирована или отменена. |
3 | boolean isNewTransaction() Этот метод возвращает истину, если текущая транзакция новая. |
4 | boolean isRollbackOnly() Этот метод возвращает, была ли транзакция помечена как откатная. |
5 | void setRollbackOnly() Этот метод устанавливает транзакцию только для отката. |