Spring事务理解和配置

文章目录

  • 1 Spring事务
    • 1.1 事务简介
      • 1.1.1 什么是事务
      • 1.1.2 事物的特性
      • 1.1.3 不考虑事物会引发的安全问题
      • 1.1.4 事务隔离级别
    • 1.2 事务的传播行为
    • 1.3 编程式事务(需要手动写代码,了解)
      • 1.3.1 配置平台事务管理器
      • 1.3.2 Spring提供了事务管理的模板类
      • 1.3.3 在业务层注入事务管理的模板
      • 1.3.4 编写事务管理的代码
    • 1.4 声明式事务(xml配置)
      • 1.4.1 配置事务管理器
      • 1.4.2 配置增强
      • 1.4.3 AOP的配置
    • 1.5 声明式事务(注解)
      • 1.5.1 配置事务管理器
      • 1.5.2 开启注解事务
      • 1.5.3 在业务层添加注解

1 Spring事务

1.1 事务简介

1.1.1 什么是事务

  • 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败.

1.1.2 事物的特性

  • 原子性:事务不可分割
  • 一致性:事务执行前后数据完整性保持一致
  • 隔离性:一个事务的执行不应该受到其他事物的影响
  • 持久性:一旦事务结束,数据就持久化到数据库

1.1.3 不考虑事物会引发的安全问题

  • 读问题
    • 脏读:一个事务读到另一个事务未提交的数据
    • 不可重复度:一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致.
    • 幻读:一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致
  • 写问题
    • 丢失更新

1.1.4 事务隔离级别

  • Read uncommitted:读未提交,任何问题解决不了
  • Read committed:读已提交,解决脏读,但是不可重复度和幻读有可能发生(Oracle默认)
  • Repeatable read:重复度,解决脏读和不可重复读,但是幻读可能发生(msyql默认)
  • Serializable:序列化,解决所有读问题

1.2 事务的传播行为

  • Spring中提供了七种事务的传播行为:
    • 保证多个操作在同一个事务中

      • PROPAGATION_REQUIRED:默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
      • PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
      • PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。
    • 保证多个操作不在同一个事务中

      • PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
      • PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
      • PROPAGATION_NEVER :如果A中有事务,报异常。
    • 嵌套式事务

      • PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。

1.3 编程式事务(需要手动写代码,了解)

1.3.1 配置平台事务管理器

<!-- 配置平台事务管理器============================= -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

1.3.2 Spring提供了事务管理的模板类

<!-- 配置事务管理的模板 -->
	<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
		<property name="transactionManager" ref="transactionManager"/>
	</bean>

1.3.3 在业务层注入事务管理的模板

<!-- 配置Service============= -->
	<bean id="accountService" class="com.itheima.tx.demo1.AccountServiceImpl">
		<property name="accountDao" ref="accountDao"/>
		<!-- 注入 事务管理的模板 -->
		<property name="trsactionTemplate" ref="transactionTemplate"/>
	</bean>

1.3.4 编写事务管理的代码

public void transfer(final String from, final String to, final Double money) {
		
		trsactionTemplate.execute(new TransactionCallbackWithoutResult() {
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
				accountDao.outMoney(from, money);
				int d = 1/0;
				accountDao.inMoney(to, money);
			}
		});

1.4 声明式事务(xml配置)

1.4.1 配置事务管理器

<!-- 配置事务管理器=============================== -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

1.4.2 配置增强

<!-- 配置事务的增强=============================== -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 事务管理的规则 -->
			<!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
			<tx:method name="find*" read-only="true"/> -->
			<tx:method name="*" propagation="REQUIRED" read-only="false"/>
		</tx:attributes>
	</tx:advice>

1.4.3 AOP的配置

<!-- aop的配置 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.itheima.tx.demo2.AccountServiceImpl.*(..))" id="pointcut1"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
	</aop:config>

1.5 声明式事务(注解)

1.5.1 配置事务管理器

<!-- 配置事务管理器=============================== -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

1.5.2 开启注解事务

<!-- 开启注解事务================================ -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

1.5.3 在业务层添加注解

@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService {

你可能感兴趣的:(Spring)