Spring使用AOP来实现声明式事务,Spring在默认情况下回对接口使用JDK动态代理技术,对具体实现类使用Cglib动态代理技术。
在切面配置的时候使用到的@Aspect注解,使用的是Aspectj框架的切面表达式,这个框架是一个由Java开发的基于静态代理的AOP框架。Aspectj支持的功能更加强大,支持对字段、POJO类进行增强,而Spring只支持对方法级别进行增强。引起Spring中还是采用动态代理的方式,但是会用到Aspectj框架中的切面表达式。
Spring基于方法级别的动态代理增强五种方式:
- 前置增强
- 后置增强
- 环绕增强
- 异常抛出增强
- 引介增强:为目标类添加新的方法和属性。
**声明式事务通过环绕增强来实现:**在目标方法执行前开启事务,在目标方法执行之后提交或者回滚事务。
## 事务传播行为
在@Transactional注解的propagation属性中指定。
Spring支持7种事务传播行为,用于确定客户端(Service1)与被调用端(Service2)的事务边界。
- PROPAGATION\_REQUIRED:方法必须在一个事务中运行,没有的话重启开启一个事务。
- PROPAGATION\_SUPPORTS:方法不用在一个事务中运行。
- PROPAGATION\_MANDATORY:必须在一个事务运行,没有抛出异常。
【参考】
- [Spring事务传播行为 - 掘金 (juejin.cn)](https://juejin.cn/post/6844903600943022088)
- 第一章 Java基础
- ThreadLocal
- Java异常体系
- Java集合框架
- List接口及其实现类
- Queue接口及其实现类
- Set接口及其实现类
- Map接口及其实现类
- JDK1.8新特性
- Lambda表达式
- 常用函数式接口
- stream流
- 面试
- 第二章 Java虚拟机
- 第一节、运行时数据区
- 第二节、垃圾回收
- 第三节、类加载机制
- 第四节、类文件与字节码指令
- 第五节、语法糖
- 第六节、运行期优化
- 面试常见问题
- 第三章 并发编程
- 第一节、Java中的线程
- 第二节、Java中的锁
- 第三节、线程池
- 第四节、并发工具类
- AQS
- 第四章 网络编程
- WebSocket协议
- Netty
- Netty入门
- Netty-自定义协议
- 面试题
- IO
- 网络IO模型
- 第五章 操作系统
- IO
- 文件系统的相关概念
- Java几种文件读写方式性能对比
- Socket
- 内存管理
- 进程、线程、协程
- IO模型的演化过程
- 第六章 计算机网络
- 第七章 消息队列
- RabbitMQ
- 第八章 开发框架
- Spring
- Spring事务
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 数据库
- Mysql
- Mysql中的索引
- Mysql中的锁
- 面试常见问题
- Mysql中的日志
- InnoDB存储引擎
- 事务
- Redis
- redis的数据类型
- redis数据结构
- Redis主从复制
- 哨兵模式
- 面试题
- Spring Boot整合Lettuce+Redisson实现布隆过滤器
- 集群
- Redis网络IO模型
- 第十章 设计模式
- 设计模式-七大原则
- 设计模式-单例模式
- 设计模式-备忘录模式
- 设计模式-原型模式
- 设计模式-责任链模式
- 设计模式-过滤模式
- 设计模式-观察者模式
- 设计模式-工厂方法模式
- 设计模式-抽象工厂模式
- 设计模式-代理模式
- 第十一章 后端开发常用工具、库
- Docker
- Docker安装Mysql
- 第十二章 中间件
- ZooKeeper