Главная страница
Навигация по странице:

  • 21.2. Как @Transactional парсится и что Spring с ней делает

  • 21.3. Значения параметра Propagation

  • 2. REQUIRES_NEW

  • 4. MANDATORY

  • 6. NOT_SUPPORTED

  • 21.4. Другие параметры @Transaction

  • 21.5.1. Что делает Interceptor

  • 2. Предоставляет интерфейс PlatformTransactionManager

  • 3. Идет создание транзакций

  • 4. Происходит вызов основного метода

  • Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми


    Скачать 0.73 Mb.
    НазваниеИнструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
    Дата13.11.2022
    Размер0.73 Mb.
    Формат файлаdocx
    Имя файла2.docx
    ТипИнструкция
    #785689
    страница14 из 26
    1   ...   10   11   12   13   14   15   16   17   ...   26

    21.1. EntityManager proxy? Почему рекомендуется использовать аннотации?


    Например, когда происходит вызов метода entityManager.persist(), он не вызывается напрямую у EntityManager. Вместо этого вызывается прокси, который достает текущий EntityManager из потока, в который его положил менеджер транзакций.

    Подход через аннотации намного удобен и удобочитаем и поэтому рекомендуется использовать именно его.

    21.2. Как @Transactional парсится и что Spring с ней делает?


    У Spring есть специальный парсер для этого – SpringTransactionAnnotationParser (используется по умолчанию).

    SpringTransactionAnnotationParser – это реализация стратегии для разбора аннотации Spring Transactional.

    Находится в пакете: java.lang.Objectorg.springframework.transaction.annotation

    21.3. Значения параметра Propagation?


    1. REQUIRED – применяется по умолчанию. При входе в @Transactional метод будет использована уже существующая транзакция или создана новая транзакция, если никакой еще нет.

    2. REQUIRES_NEW – новая транзакция всегда создается при входе метод, ранее созданные транзакции приостанавливаются до момента возврата из метода.

    3. NESTED – корректно работает только с базами данных, которые умеют устанавливать savepoints. При входе в метод в уже существующей транзакции создается savepoint, который по результатам выполнения метода будет либо сохранен, либо отменен. Все изменения, внесенные методом, подтвердятся только позднее с подтверждением всей транзакции. Если текущей транзакции не существует, будет создана новая.

    Savepoint – устанавливает новую точку сохранения в текущей транзакции. Точка сохранения — это специальная отметка внутри транзакции, которая позволяет откатить все команды, выполненные после нее, и восстановить таким образом состояние на момент установки этой точки.

    4. MANDATORY – всегда используется существующая транзакция и кидается исключение, если текущей транзакции нет.

    5. SUPPORTSметод будет использовать текущую транзакцию, если она есть, либо будет исполнятся без транзакции, если ее нет.

    6. NOT_SUPPORTED – при входе в метод текущая транзакция, если она есть, будет приостановлена, и метод будет выполняться без транзакции.

    7. NEVER – явно запрещает исполнение в контексте транзакции. Если при входе в метод будет существовать транзакция, будет выброшено исключение.

    21.4. Другие параметры @Transaction?


    1. rollbackFor = Exception.class – если какой-либо метод выбрасывает указанное исключение, контейнер всегда откатывает текущую транзакцию. По умолчанию отлавливает RuntimeException;

    2. noRollbackFor = Exception.class – указание того, что любое исключение, кроме заданного, должно приводить к откату транзакции;

    3. rollbackForClassName и noRollbackForClassName – для задания имен исключений в строковом виде;

    4. readOnly – разрешает только операции чтения. В свойстве transactionManager хранится ссылка на менеджер транзакций, определенный в конфигурации Spring;

    5. timeOut – по умолчанию используется таймаут, установленный по умолчанию для базовой транзакционной системы. Сообщает менеджеру tx о продолжительности времени, чтобы дождаться простоя tx, прежде чем принять решение об откате не отвечающих транзакций;

    6. isolation – уровень изолированности транзакций.


    21.5. Interceptor?


    В Spring, когда запрос отправляется controller, перед тем как запрос обрабатывается Controller-ом, он должен перейти через перехватчиков Interceptor (0 или более).

    Spring Interceptor это понятие доволно схожее с Servlet Filter.

    Spring Interceptor применяется к запросам отправленным к Controller.


    Мануал: https://clck.ru/sQNu5

    21.5.1. Что делает Interceptor?


    1. Считывает атрибуты (параметры), которые были у аннотации @Transactional;

    Пример кода:

    txAttr = getTRansactionAttributeSource();

    getTransactionAttribute(invocation.getMethod(), targetClass);
    2. Предоставляет интерфейс PlatformTransactionManager – основной интерфейс для всех TransactionManager (TransactionManager взаимодействует непосредственно с БД для управлением транзакций);

    Пример кода:

    PlatformTransactionManager ptm = determineTransactionManager(txAttr);
    Spring сам по себе транзакциями не управляет. Он является прослойкой между вашим декларативным описанием и конечной базой данных. Он все делегирует базе данных.

    Spring — это просто удобный для нас способ объявить транзакции, но внутри себя Spring не содержит чего-то такого, что можно было бы назвать транзакцией.
    3. Идет создание транзакций – в зависимости от того, как сконфигурированы атрибуты, транзакцию можно начать или нет.

    Пример кода:

    TransactionInfo trInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification);
    4. Происходит вызов основного метода,

    Пример кода:

    try {

    retVal = invocation.proceed();

    } catch(Throwable ex) {

    completeTransactionAfterThrowinf(trInfo, ex);

    }

    где invocation.proceed() – вызов основного транзакционного метода с кодом.
    5. Происходит commit транзакции если нет exception.

    Пример кода:

    commitTransactionAfterReturning(trInfo);
    Что касается настроек, так в XML можно указать такие параметры, как: все методы, начинающиеся на find, сделать readOnly, а методы, начинающиеся на create получают откат транзакции в случае возникновения, например SQLException и не откатываются в случае получения RuntimeException, уровни изоляции и другие.

    Пример кода:








    propagation=”MANDATORY”/> <

    /tx:attributes>


    Также можно указать для какого конкретно класса можем использовать эти правила, что позволяет более гибко настраивать логику. Указываем, что данное правило будет применяться для всех методов в классе FindInformationService будет использоваться конфигурация transactionRule01.

    Пример кода:


    com.helpdesk.FindInformationService.*(…))”/>


    ref=”findInformationServiceByUser”>


    1   ...   10   11   12   13   14   15   16   17   ...   26


    написать администратору сайта