Управление транзакциями в Spring Framework Series

задняя часть база данных Spring Oracle

1. Обзор бизнеса

(1), что такое транзакция:

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

(2), характеристики транзакции (ACID)
  • Атомарность: подчеркивает неделимость транзакций.
  • Непротиворечивость: целостность данных до и после выполнения транзакции непротиворечива.
  • Изоляция: во время выполнения транзакции ей не должны мешать другие транзакции.
  • Долговечность: после завершения транзакции данные сохраняются в базе данных.
(3), проблемы безопасности параллелизма транзакций
  • Грязное чтение: транзакция считывает незафиксированные данные из другой транзакции.
  • Неповторяющееся чтение: транзакция считывает данные обновления, отправленного другой транзакцией, что приводит к противоречивым результатам нескольких запросов.
  • Фантомное чтение: транзакция считывает данные вставки, отправленной другой транзакцией, что приводит к противоречивым результатам нескольких запросов.
(4), уровень изоляции транзакций
  • Незафиксированные чтения: могут происходить грязные чтения, неповторяемые чтения и фантомные чтения.
  • Чтение подтверждено: избегайте грязных чтений, но могут возникать неповторяющиеся чтения и фантомные чтения.
  • Повторяемые чтения: избегайте грязных чтений и неповторяющихся чтений, но могут возникать фантомные чтения.
  • Сериализация: Избегайте всех вышеперечисленных проблем с чтением
(5), уровень изоляции транзакций по умолчанию для общих баз данных.
  • MySQL: повторяющееся чтение
  • Oracle: чтение зафиксировано

2. Весеннее управление транзакциями

(1), основные бизнес-операции
  • открытая транзакция
  • совершить транзакцию
  • транзакция отката
(2), объект операции транзакции

Интерфейс PlatformTransactionManager предоставляется в управлении транзакциями Spring для управления транзакциями, а основным объектом является объект TransactionManager.

(3), уровень изоляции транзакций Spring
  • читать незафиксированные
  • чтение зафиксировано
  • повторяемое чтение
  • сериализовать
(4), поведение распространения транзакций Spring

гарантировано в той же сделке

  • PROPAGATION_REQUIRED : поддерживать текущую транзакцию, создать новую, если она не существует (по умолчанию)
  • PROPAGATION_SUPPORTS: поддерживать текущую транзакцию, если она не существует, не использовать транзакцию
  • PROPAGATION_MANDATORY: поддерживает текущую транзакцию, выдает исключение, если она не существует.

Гарантировано, что не будет в той же транзакции

  • PROPAGATION_REQUIRES_NEW: если транзакция существует, приостановить текущую транзакцию и создать новую транзакцию.
  • PROPAGATION_NOT_SUPPORTED: запустить в нетранзакционном режиме, приостановить текущую транзакцию, если транзакция существует.
  • PROPAGATION_NEVER: запустить в нетранзакционном режиме, выдать исключение, если транзакция существует.
  • PROPAGATION_NESTED: если текущая транзакция существует, выполняется вложенная транзакция.

3. Метод управления транзакциями Spring

(1), кодирование
  • Настройте основной диспетчер транзакций для контейнера Spring.
<!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
    <property name="dataSource" ref="dataSource" ></property>
</bean>
  • Настройте шаблон TransactionTemplate
<!-- 事务模板对象 -->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" >
    <property name="transactionManager" ref="transactionManager" ></property>
</bean>
  • Внедрить шаблон транзакции в сервис
<!-- 将 demoDao 和事务模板注入 Service-->
<bean name="demoService" class="com.spring.service.demoServiceImpl" >
    <property name="dm" ref="demoDao" ></property>
    <property name="tt" ref="transactionTemplate" ></property>
</bean>  
  • Вызов шаблона в Сервисе
(2), метод конфигурации xml
  • Импортируйте необходимые банки и ограничения

  • Настройка уведомлений о транзакциях

<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager" >
    <tx:attributes>
        <!-- 以方法为单位,指定方法应用什么事务属性
            isolation:隔离级别
            propagation:传播行为
            read-only:是否只读
         -->
        <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        <tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        <tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        <tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        <tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
        <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
        <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
    </tx:attributes>
</tx:advice>
  • Вплетайте уведомления в цели
<!-- 配置织入 -->
<aop:config  >
    <!-- 配置切点表达式 -->
    <aop:pointcut expression="execution(*com.spring.service.*ServiceImpl.*(..))" id="txPc"/>
    <!-- 配置切面 : 通知+切点
            advice-ref:通知的名称
            pointcut-ref:切点的名称
     -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
</aop:config>
(3), метод конфигурации аннотации
  • Импортируйте необходимые банки и ограничения

  • Включить транзакции управления аннотациями

<!-- 开启使用注解管理事务 -->
<tx:annotation-driven/>
  • Используйте аннотации в конкретном бизнесе

          Отсканируйте общедоступную учетную запись WeChat и подпишитесь на нее, чтобы узнать больше.