Spring 的声明式事务:

不继承JdbcDaoSupport 的方式 完成对数据库的访问
和之前的不同在于 需要我们自己在容器中创建一个模板对象(模板对象依赖于dataSource)
再把模板 注入给DAO 的实现类 使用自己的模板完成对应的操作

  1. Spring 的声明式事务

Spring声明式事务管理,是使用Spring的AOP方式实现的

  1. 通过Spring配置将操作纳入到事务管理中
  2. 解除了事务管理和代码的耦合
  3. 不需要事务管理时,可直接从Spring配置文件中移除
  1. Spring 声明式事务的实现步骤

    1. 开启声明式事务
      `
      <tx:annotation-driven transaction-manager=”事务管理器id”
      proxy-target-class=”false”/>

    proxy-target-class 如果是false 代表优先使用sun公司的代理机制生成代理
    proxy-target-class 如果是true 代表使用CGLIB的代理机制生成代理

    2. 在Spring 容器中创建一个事务管理器对象--- 依赖于dataSource  
    



    
    3. 在需要事务管理的类或者方法上加事务管理标注  
    `@Transactional`  
    `@Transactional`的属性  
    - rollbackFor Spring 的声明式事务 默认只针对运行时异常进行事务回滚  
    - noRollbackFor 针对指定的运行时异常 不回滚  
    - isolation 事务隔离级别:  
    读未提交  读提交  可重复读  序列化    
    用于解决事务隔离三大读问题:  
    - 脏读: 一个事务读取到了另外一个事务没提交的数据(好处效率高)
    - 不可重复读: 一个事务在开始时 读取了一份数据 另外一个事务修改了这份数据 并进行了提交 当第一个事务再次读取数据时 发现数据发生改变.(不让另一个事务发生更改,安全性高,占用资源多)
    - 幻读: 一个事务统计了整张表的所有数据 另外一个事务增加了数据 并进行提交 当再次统计数据时 数据发生了改变  
    
    - readOnly 只读事务 只有当事务语句都是查询时 才能使用这个属性的值是true  默认这个属性的值是false  
    
    - propagation 事务传播特性 一个方法去调用另一个事务方法时 事务应该如何表现  
    

    Propagation.REQUIRED 如果当前方法没有事务 则会开启新事务
    如果当前方法有事务 则将事务加入到当前事务中

    propagation_required: 如果当前没有事务 ,就新建一个事务, 如果已存在一个事务中,加入到这个事务中,这是最常见的选择
    propagation_supports: 支持当前事务, 如果没有当前事务, 就以非事务方法执行
    propagation_mandatory: 使用当前事务, 如果没有当前事务, 就抛出异常
    propagation_required_new: 新建事务,如果当前存在事务,把当前事务挂起
    propagation_not_supported: 以非事务方式执行操作, 如果当前存在事务, 就把当前事务挂起
    propagation_never: 以非事务方式执行操作, 如果当前事务存在则抛出异常
    propagation_nested: 如果当前存在事务, 则再嵌套事务内执行, 如果当前没有事务, 则执行propagation_required
    `