秋招Day17 - Spring - 事务

Spring事务的种类

编程式事务和声明式事务

介绍一下编程式事务管理?

通过编程的方式显式控制事务的开始、提交和回滚,一般使用TransactionTemplate的execute方法

介绍一下声明式事务管理?

基于AOP,通过调用代理对象拦截目标方法,在方法执行前插入事务开始的横切逻辑,在方法执行后根据执行情况来选择提交还是回滚。不需要在业务逻辑中显式的编写事务相关的代码,Spring 推荐通过 @Transactional注解的方式来实现声明式事务管理,也是日常开发中最常用的。

由于Spring AOP连接点类型的限制,最细粒度只能是方法级别。

Spring的事务传播机制?

事务传播机制定义了一个事务方法被另一个事务方法调用时的事务行为,这些行为定义了事务边界和事务上下文如何在调用链中传播。

默认是Required,也就是说如果当前存在事务,则加入当前事务,如果不存在,则新建事务。

事务传播机制是通过ThreadLocal实现的,也就是说,如果调用事务的时候使用了一个新线程,则事务传播机制失效

声明式事务的实现原理了解吗?

基于AOP和代理机制。

++首先是在Bean的初始化阶段创建目标类的代理对象++

Spring容器在初始化单例Bean的时候,会遍历所有的BeanPostProcessor实现类,并执行其 postProcessAfterInitialization 方法检查这个Bean的类或方法上有没有**@Transactional**,如果有的话,Spring就知道这个Bean需要事务增强,会为其通过JDK动态代理或者CGLIB代理生成一个代理对象,实际注入这个Bean的时候注入的是代理对象。

++然后通过代理对象拦截需要被事务增强的目标方法++ ,转发到事务拦截器的invoke方法中,这个方法中会插入事务开启、提交或回滚的横切逻辑,是一种环绕增强

声明式事务在哪些情况下会失效?

如果 @Transactional 注解应用在非 public 修饰的方法上,Transactional 将会失效。

@Transactional 注解中的事务传播机制属性配置错误,默认是Required

@Transactional 注解中的rollbackFor属性配置错误,默认是unchecked异常和Error下回滚

同一个类中调用事务方法,因为只有在声明@Transactional 注解的类外调用事务方法才能生成代理对象

一个事务方法调用另一个事务方法时,用try-catch捕获了另一个事务方法的异常

相关推荐
CRMEB系统商城11 分钟前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
@Mike@19 分钟前
02-数据库学习笔记(SQL引擎)
数据库·笔记·学习
keyipatience1 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
笃行3502 小时前
国产化落地避坑 · 干货向|Oracle 迁金仓 KES,我把外连接消除排在隐性陷阱第一位
数据库
weixin_408099672 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
老纪的技术唠嗑局2 小时前
花一年时间整理出的:AI 数据库混合搜索入门实践
数据库
钱六两2 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
Suhan423 小时前
IDEA 设置启动参数和环境变量
spring boot·spring·编辑器·idea
川石课堂软件测试3 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
笃行3503 小时前
国产化落地避坑 · 干货向|迁移后那条「测试能过、一上生产就查空」的 SQL,多半栽在 WHERE 函数顺序上
数据库