栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring @transactional 事务应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring @transactional 事务应用

spring 事务:
 一: 理论:
  事务(ACID): 
  A:原子性-都成功,都失败; 
  C:一致性(A转账给B,A扣了一百,B的钱一定增加); 
  I:隔离性(事务之间互不干扰); 
  D:持久性(修改是永久的)
  
  1. 传播行为: 一个事务掉另一个事务,多个事务操作时怎么处理
     1.1 PROPAGATION_REQUIRED(默认): 当前事务存在,使用当前事务;当前不存在, 新建一个事务
     1.2 PROPAGATION_SUPPORTS:  当前事务存在,使用当前事务;当前不存在, 则不建立事务, 用非事务方式执行
     1.3 PROPAGATION_MANDATORY: 当前事务存在,使用当前事务;当前不存在,抛异常
     1.4 PROPAGATION_REQUIRES_NEW: 当前事务存在则挂起, 新建一个事务, 两个事务独立运行,可通过捕获新建事务执行异常判断当前事务是否需要回滚操作
     1.5 PROPAGATION_NOT_SUPPORTED: 当前事务存在则挂起,用非事务方式执行
     1.6 PROPAGATION_NEVER: 当前事务存在则抛异常,用非事务方式执行
     1.7 PROPAGATION_NESTED: 当前事务存在则嵌套事务, 不存在则新建一个事务
     @Transactional(propagation=Propagation.PROPAGATION_REQUIRED)
     
  2. 隔离级别: 
     并发情况会出现:
     脏读: 读取未提交数据
     不可重复读: 读取过程中有数据更新
     幻读: 修改过程中, 有数据更新
     2.1 ISOLATION_DEFAULT 默认级别 
     2.2 ISOLATION_READ_UNCOMMITTED: 读未提交的数据
     2.3 ISOLATION_READ_COMMITTED: 读已提交数据
     2.4 ISOLATION_REPEATABLE_READ(默认): 多次读取结果一致
     2.5 ISOLATION_SERIALIZABLE: 锁表,一个一个来
     @Transactional(isolation = Isolation.READ_COMMITTED)
     @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
     
  3. 回滚:
     默认: RuntimeException和Error 
     @Transactional(rollbackFor=Exception.class): 让在发生非RuntimeException时也能回滚
     @Transactional(rollbackFor={RuntimeException.class, Exception.class}: 多个
     @Transactional(rollbackForClassName={“RuntimeException”,“Exception”}): 多个
     @Transactional(notRollbackFor=Exception.class): 让在发生RuntimeException时不回滚
     TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 手动回滚事务
     
  4. 超时: 超时则回滚
     @Transactional(timeout = 1000)
     
  5. 是否只读:
     @Transactional(readOnly = true): 只查询, 不修改  
      
 二: 应用:
  1. xml式: 略
  2. transactional
  2.1 原理: spring通过aop动态代理生成bean容器里面的实例,当遇到@transactional注解的类, 会生成代理类继承原来那个bean,
            通过代理类调用方法才会使@transactional生效,创建事务;
  2.1 失效原因: 1. 本类方法调用, 方法a内部调用方法b, 类似于this.b, 必须经过代理类调用才会生效, 例如, B.b();
                    SpringContextHolder.getBean(B.class): 获取容器中B类的实例(有@transactional注解的是代理类);
                2. 因为aop代理的原因, 方法必须是实现的public方法, 其他比如private, aop拿不到, 注解也就失效了
                
    默认传播行为前提下:
        方法a调用方法b, spring 先看a有没有事务, 然后再看b有没有事务
         1. a 没有事务, a,b 都不会有事务  
         2. a 有事务, b有事务, 遵循传播行为, a,b共用a的事务
         3. a 有事务, b没有事务, 遵循传播行为, a有事务,b没有事务
                  
                
                
                
                
                
                
                

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号