spring笔记

@Transactional

在方法开始前开启事务

检查异常(unchecked exception)不回滚

如果想针对检查异常进行事务回滚,可以在@Transactional注解里使用 rollbackFor属性明确指定异常。

@Transactional(rollbackFor = Exception.class)

catch的异常不回滚,除非再throw

推荐做法:在业务层统一抛出异常,然后在控制层统一处理。

这样业务层一直在抛异常,就保证了事务会回滚;同时异常可以在控制层统一处理了

Transactional注解的常用属性表:

属性 说明
propagation 事务的传播行为,默认值为 REQUIRED。
isolation 事务的隔离度,默认值采用 DEFAULT
timeout 事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。
read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
rollbackFor 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class,……}
noRollbackFor 抛出 no-rollback-for 指定的异常类型,不回滚事务。{xxx1.class, xxx2.class,……}

事务不生效的几种 Case

主要讲解 4 种事务不生效的 Case:

  • 类内部访问:A 类的 a1 方法没有标注 @Transactional,a2 方法标注 @Transactional,在 a1 里面调用 a2;
  • 私有方法:将 @Transactional 注解标注在非 public 方法上;
  • 异常不匹配:@Transactional 未设置 rollbackFor 属性,方法返回 Exception 等异常;
  • 多线程:主线程和子线程的调用,线程抛出异常

注入

原理与顺序,是从谁注入??

动态代理

jdk动态代理需要基于接口实现,因为底层源码时通过实现接口的方式实现代理的;如果使用类的话,会受到java单继承机制的限制;
spring默认使用jdk动态代理

你可能感兴趣的:(spring,笔记,java)