Учебники

Весна — Управление транзакциями

Транзакция базы данных — это последовательность действий, которые рассматриваются как единая единица работы. Эти действия должны либо полностью завершиться, либо вообще не иметь никакого эффекта. Управление транзакциями является важной частью корпоративного приложения, ориентированного на СУБД, для обеспечения целостности и согласованности данных. Концепция транзакций может быть описана следующими четырьмя ключевыми свойствами, описанными как ACID

  • Атомарность . Транзакция должна рассматриваться как единая операция, что означает, что вся последовательность операций является успешной или неудачной.

  • Согласованность — представляет согласованность ссылочной целостности базы данных, уникальных первичных ключей в таблицах и т. Д.

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

  • Долговечность — после завершения транзакции ее результаты должны быть постоянными и не могут быть удалены из базы данных из-за сбоя системы.

Атомарность . Транзакция должна рассматриваться как единая операция, что означает, что вся последовательность операций является успешной или неудачной.

Согласованность — представляет согласованность ссылочной целостности базы данных, уникальных первичных ключей в таблицах и т. Д.

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

Долговечность — после завершения транзакции ее результаты должны быть постоянными и не могут быть удалены из базы данных из-за сбоя системы.

Реальная система баз данных СУБД будет гарантировать все четыре свойства для каждой транзакции. Упрощенный вид транзакции, выданной в базу данных с использованием SQL, выглядит следующим образом:

  • Начните транзакцию, используя команду начала транзакции .

  • Выполните различные операции удаления, обновления или вставки с использованием запросов SQL.

  • Если все операции выполнены успешно, выполните коммит, иначе откатите все операции.

Начните транзакцию, используя команду начала транзакции .

Выполните различные операции удаления, обновления или вставки с использованием запросов SQL.

Если все операции выполнены успешно, выполните коммит, иначе откатите все операции.

Spring Framework предоставляет абстрактный слой поверх различных базовых API-интерфейсов управления транзакциями. Поддержка транзакций Spring направлена ​​на предоставление альтернативы транзакциям EJB путем добавления возможностей транзакций в POJO. Spring поддерживает как программное, так и декларативное управление транзакциями. Для EJB требуется сервер приложений, но управление транзакциями Spring может быть реализовано без сервера приложений.

Местные и глобальные транзакции

Локальные транзакции относятся к одному транзакционному ресурсу, такому как соединение JDBC, тогда как глобальные транзакции могут охватывать несколько транзакционных ресурсов, например транзакции в распределенной системе.

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

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

Программный и декларативный

Spring поддерживает два типа управления транзакциями —

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

  • Декларативное управление транзакциями — это означает, что вы отделяете управление транзакциями от бизнес-кода. Вы используете только аннотации или конфигурацию на основе XML для управления транзакциями.

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

Декларативное управление транзакциями — это означает, что вы отделяете управление транзакциями от бизнес-кода. Вы используете только аннотации или конфигурацию на основе XML для управления транзакциями.

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

Абстракции весенней транзакции

Ключ к абстракции транзакции 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;
}

Sr.No Метод и описание
1

TransactionStatus getTransaction (определение TransactionDefinition)

Этот метод возвращает текущую активную транзакцию или создает новую в соответствии с заданным поведением распространения.

2

void commit (статус TransactionStatus)

Этот метод фиксирует данную транзакцию с учетом ее статуса.

3

откат void (статус TransactionStatus)

Этот метод выполняет откат данной транзакции.

TransactionStatus getTransaction (определение TransactionDefinition)

Этот метод возвращает текущую активную транзакцию или создает новую в соответствии с заданным поведением распространения.

void commit (статус TransactionStatus)

Этот метод фиксирует данную транзакцию с учетом ее статуса.

откат void (статус TransactionStatus)

Этот метод выполняет откат данной транзакции.

TransactionDefinition является основным интерфейсом поддержки транзакций в Spring и определяется следующим образом:

public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}

Sr.No Метод и описание
1

int getPropagationBehavior ()

Этот метод возвращает поведение распространения. Spring предлагает все варианты распространения транзакций, знакомые по EJB CMT.

2

int getIsolationLevel ()

Этот метод возвращает степень, в которой эта транзакция изолирована от работы других транзакций.

3

Строка getName ()

Этот метод возвращает имя этой транзакции.

4

int getTimeout ()

Этот метод возвращает время в секундах, в течение которого транзакция должна завершиться.

5

логическое isReadOnly ()

Этот метод возвращает информацию о том, доступна ли транзакция только для чтения.

int getPropagationBehavior ()

Этот метод возвращает поведение распространения. Spring предлагает все варианты распространения транзакций, знакомые по EJB CMT.

int getIsolationLevel ()

Этот метод возвращает степень, в которой эта транзакция изолирована от работы других транзакций.

Строка getName ()

Этот метод возвращает имя этой транзакции.

int getTimeout ()

Этот метод возвращает время в секундах, в течение которого транзакция должна завершиться.

логическое isReadOnly ()

Этот метод возвращает информацию о том, доступна ли транзакция только для чтения.

Ниже приведены возможные значения уровня изоляции:

Sr.No Изоляция и описание
1

TransactionDefinition.ISOLATION_DEFAULT

Это уровень изоляции по умолчанию.

2

TransactionDefinition.ISOLATION_READ_COMMITTED

Указывает, что грязные чтения предотвращены; могут произойти неповторяющиеся чтения и фантомные чтения.

3

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

Указывает, что могут произойти грязные чтения, неповторяющиеся чтения и фантомные чтения.

4

TransactionDefinition.ISOLATION_REPEATABLE_READ

Указывает, что грязные чтения и неповторяющиеся чтения предотвращены; может произойти фантомное чтение.

5

TransactionDefinition.ISOLATION_SERIALIZABLE

Указывает, что грязные чтения, неповторяющиеся чтения и фантомные чтения предотвращены.

TransactionDefinition.ISOLATION_DEFAULT

Это уровень изоляции по умолчанию.

TransactionDefinition.ISOLATION_READ_COMMITTED

Указывает, что грязные чтения предотвращены; могут произойти неповторяющиеся чтения и фантомные чтения.

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

Указывает, что могут произойти грязные чтения, неповторяющиеся чтения и фантомные чтения.

TransactionDefinition.ISOLATION_REPEATABLE_READ

Указывает, что грязные чтения и неповторяющиеся чтения предотвращены; может произойти фантомное чтение.

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

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

TransactionDefinition.PROPAGATION_MANDATORY

Поддерживает текущую транзакцию; выдает исключение, если текущей транзакции не существует.

TransactionDefinition.PROPAGATION_NESTED

Выполняется во вложенной транзакции, если текущая транзакция существует.

TransactionDefinition.PROPAGATION_NEVER

Не поддерживает текущую транзакцию; выдает исключение, если текущая транзакция существует.

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

Не поддерживает текущую транзакцию; скорее всегда выполняйте нетранзакционно.

TransactionDefinition.PROPAGATION_REQUIRED

Поддерживает текущую транзакцию; создает новый, если ни один не существует.

TransactionDefinition.PROPAGATION_REQUIRES_NEW

Создает новую транзакцию, приостанавливая текущую транзакцию, если она существует.

TransactionDefinition.PROPAGATION_SUPPORTS

Поддерживает текущую транзакцию; выполняется без транзакций, если ни один не существует.

TransactionDefinition.TIMEOUT_DEFAULT

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

Интерфейс TransactionStatus обеспечивает простой способ для транзакционного кода контролировать выполнение транзакции и запрашивать статус транзакции.

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}

логическое hasSavepoint ()

Этот метод возвращает, содержит ли эта транзакция внутреннюю точку сохранения, т. Е. Была ли она создана как вложенная транзакция на основе точки сохранения.

логическое значение isCompleted ()

Этот метод возвращает, завершена ли эта транзакция, т. Е. Была ли она уже зафиксирована или откатана.

логическое isNewTransaction ()

Этот метод возвращает true, если текущая транзакция является новой.

логическое isRollbackOnly ()

Этот метод возвращает, была ли транзакция помечена как только для отката.

void setRollbackOnly ()

Этот метод устанавливает транзакцию только для отката.