Spring----07----SpringAOP事务管理

目录

  • Spring----07----AOP事务管理
    • 1. 回顾事务特性
      • 1.1 ACID
      • 1.2 并发问题
      • 1.2 隔离级别
    • 2. SpringAOP事务
      • 2.1 AOP事务设计
      • 2.2 AOP事务原理
      • 2.3 AOP事务演示
        • 2.3.1 准备Dao方法
        • 2.3.2 准备Service方法
        • 2.3.3 Applicationcontext.xml配置
      • 2.4 注解AOP配置
        • 2.4.1 开启注解AOP配置
        • 2.4.2 在业务类上加注解管理器

Spring----07----AOP事务管理

1. 回顾事务特性

1.1 ACID

  • 原子性(A):事务所包裹的SQL语句,要么都成功,要么都失败;
  • 一致性(C):事务执行前后,数据库数据的一致性状态不应发生变化;
  • 隔离性(I) :并发的多个事务之间,互不影响;
  • 持久性(D):事务一旦提交,数据应被永久存储道永久存储介质中。

1.2 并发问题

  • 脏读:读取到其他事务正在操作,但是未被提交的数据;
  • 不可重复读:一次事务内,读取相同(行)的数据两次得到的结果不一致;
  • 幻读:针对于整表操作,例如涉及整表的删除或修改,在整表操作期间,有其他事务插入了新的数据,导致整表操作结果不符合预期。

1.2 隔离级别

读未提交:可以读取到,其他事务正在操作,未被提交的数据,会产生脏读|不可重复读|幻读;
读已提交:只能读取到已经提交的数据,避免脏读,会产生不可重复读|幻读;
可重复读:确保同一(行)数据,一个事务内的两次读取结果是一致的,会产生幻读;
串行化:针对当前操作的数据加锁,实现串行访问,没用并发问题,但是效率极低。

2. SpringAOP事务

2.1 AOP事务设计

Spring----07----SpringAOP事务管理_第1张图片

     以前事务代码是写在每个Service类中的每个业务方法中的,每个方法都要写,写的时候很痛苦,又必须要做,并且写完之后,如果事务代码发生变动,也难以维护,因为需要修改每个业务代码方法中的代码。
     有了AOP技术后,可以将事务管理代码封装到(环绕)通知中,将事务通知织入到各个切点(业务方法)上,这样就可以一劳永逸的解决事务问题,事务代码如果需要修改,也不用挨个进入到业务方法中修改,只需要维护通知中的事务管理代码即可。

2.2 AOP事务原理

Spring----07----SpringAOP事务管理_第2张图片
     AOP事务,如上图所示,就是准备好了一个封装了事务管理代码的事务(环绕)通知,将事务通知织入到service层方法即可实现事务管理;
     在事务通知设计上,为了确保优雅,可以将事务操作代码抽取到一个接口中,为接口提供不同平台操作事务代码的实现类,在不同环境下,为通知注入不同的实现类,满足平台的多样化。

2.3 AOP事务演示

2.3.1 准备Dao方法

 public void increase(Integer id, Double money) {

        String sql = "update t_user set money=money+? where id = ?";
        getJdbcTemplate().update(sql, money,id);

    }

    public void decrease(Integer id, Double money) {

        String sql = "update t_user set money=money-? where id = ?";
        getJdbcTemplate().update(sql, money,id);
    }

2.3.2 准备Service方法

public void transfer(Integer from, Integer to, Double money) {
        //为指定账户扣钱
        userDao.decrease(from,money);
        //int i = 1/0;
        //未指定账户价钱
        userDao.increase(to,money);
    }

2.3.3 Applicationcontext.xml配置


    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    bean>

    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        
        <tx:attributes>
            
            
            <tx:method name="transfer" propagation="REQUIRED"/>
            
            <tx:method name="find*" read-only="true"/>
            
            <tx:method name="*" timeout="200"/>
        tx:attributes>
    tx:advice>
    
    <aop:config>
        
        <aop:pointcut id="txPC" expression="execution(* com.leo.service.*ServiceImpl.*(..))"/>
        
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPC"/>
    aop:config>

2.4 注解AOP配置

2.4.1 开启注解AOP配置


    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    bean>
    
    <tx:annotation-driven/>

2.4.2 在业务类上加注解管理器

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false,timeout = -1)
public class UserServiceImpl implements UserService{
	//使用方法上的注解覆盖类上的注解
	@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = true,timeout = -1)
    public User findById(Integer id) {
        return userDao.findById(id);
    }

你可能感兴趣的:(SSM框架学习笔记,spring,aop,mysql,数据库)