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 и подпишитесь на нее, чтобы узнать больше.