事物可以看做是由对数据库若干操作组成的一个单元 
 
 
        事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都 必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作 要么都完成,要么都取消,从而保证数据满足一致性的要求 
 
 
 Spring 中的事务管理
(1)编程式事务
在 项 目 中 很 少 使 用 , 这 种 方 式 需 要 注 入 一 个 事 务 管 理 对 象TransactionTemplate ,然后在我们代码中需要提交事务或回滚事务时自己写代 码实现.
(2)声明式事务
 
  声明式事务 
  管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式  
 
 
  
  事务是方法级别的。  
 
 
  
  Spring 声明式事物管理方式有两种:  
 
 
  
            基于 xml 配置  
 
 
  
            基于注解实现 
 
 
  
  基于注解实现: 
 
 
  
   配置事物管理器  
  
 
   
   <!-- 配置 spring 事务管理类, 并注入数据源 -->  
  
 
   
   < 
   bean  
   id 
   ="transactionManager"  
  
 
   
   class 
   ="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
   >  
  
 
   
   < 
   property  
   name 
   ="dataSource"  
   ref 
   ="dataSource" 
   ></ 
   property 
   >  
  
 
   
   </ 
   bean 
   >  
  
 
   
   注解方式  
  
 
   
   <!-- 开启注解事务管理 -->  
  
 
   
   < 
   tx 
   :annotation-driven  
   transaction-manager 
   ="transactionManager" 
   /> 
  
 
   
    在 service 中控制事务  
   
 
    
    @Service(value="userservice")  
   
 
    
    @Transactional  
   
 
   @Transactional
事务管理标签在service的方法中进行控制,在dao层加容易出事,比如转账功能

 
 运行结果
 运行结果

 500元直接没了,所以建议在service层进行事务管理控制,如
 500元直接没了,所以建议在service层进行事务管理控制,如

两个操作中有报错,对转账结果没影响

声明式事务不生效的场景
 
    @Transactional 应用在非 public 修饰的方法上  
   
 
    
    异常被 catch 捕获导致失效  
   
 
    
    出现编译期异常  
   
 
    
    @Transactional 事务传播行为设置错误  
   
 
    
    数据库引擎不支持事务  
   
 
    
    同一个类中,使用非代理对象调用一个有事务的方法,导致事务错误 
   
 
    
   Spring 事务传播行为
 
     什么叫事务传播行为?  
    
 
     
     即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。  
    
 
     
     事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事 
     务方法调用时,这个事务方法应该如何进行。事务传播行为是 Spring 框架独有 的事务增强特性,他不属于的事务实际提供方数据库行为.  
    
 
     
     例如:methodA 事务方法调用 methodB 事务方法时,methodB 是继续在调 用者 methodA 的事务中运行呢,还是为自己开启一个新事务运行,这就是由 methodB 的事务传播行为决定的。  
    
 
     
     
     Spring 定义了七种传播行为:  
    
 
     
     1. PROPAGATION_REQUIRED  
    
 
     
     指定的方法必须在事务内执行,若当前存在事务,加入到当前事务中,若当前没  
    
 
     
     有事务,则创建一个新事务,这种传播行为是最常见的,也是 spring 默认的传播行  
    
 
     
     为.  
    
 
     
     2. PROPAGATION_SUPPORTS  
    
 
     
     支持当前事务,如果当前没有事务,就以非事务方式执行。  
    
 
     
     事务传播行为类型  
    
 
     
     说明  
    
 
     
     PROPAGATION_REQUIRED  
    
 
     
     如果当前没有事务,就新建一个事务,如果已经存在一个事务中,  
    
 
     
     加入到这个事务中。这是最常见的选择。  
    
 
     
     PROPAGATION_SUPPORTS  
    
 
     
     支持当前事务,如果当前没有事务,就以非事务方式执行。  
    
 
     
     PROPAGATION_MANDATORY  
    
 
     
     使用当前的事务,如果当前没有事务,就抛出异常。  
    
 
     
     PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。  
    
 
     
     PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。  
    
 
     
     PROPAGATION_NEVER  
    
 
     
     以非事务方式执行,如果当前存在事务,则抛出异常。  
    
 
     
     PROPAGATION_NESTED  
    
 
     
     如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,  
    
 
     
     则执行与 PROPAGATION_REQUIRED 类似的操作。 
     3. PROPAGATION_REQUIRES_NEW  
    
 
     
     总是新建一个事务,如果当前存在事务,把当前事务挂起,直到新建的事务结束 
    
 
   



















