关于springboot中@transactional、cglib代理、jdk代理使用的那些事

本文讨论了SpringBoot中事务管理的一些常见问题,包括如何正确配置@Transactional注解以避免陷阱,特别是在接口上的使用。同时介绍了如何通过调整配置来解决事务中表被锁的问题,并给出了具体的示例代码。

引用大佬的总结:

SpringBoot中修改proxyTargetClass,但事务代理始终为CGLIB

关于@transactional使用在接口上的问题

Spring事务注解@Transactional的坑爹陷阱

关于Spring事务注解@Transactional一个疑问,求大神帮忙指点

另外:

1.@Transactional事务表被锁的情况解决方法

通常在执行查询的时候,进行更新.数据量大的时候会出现锁表情况.只须在查询上不加事务,写操作则加上.

只读事务:

@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)

读写事务:

@Transactional (propagation=Propagation.REQUIRES_NEW)

 

 

 

 

### Spring Boot 中 `@Transactional` 注解的代理机制 在 Spring Boot 应用程序中,`@EnableTransactionManagement` 声明告诉框架应该为带有 `@Transactional` 注解的方法创建事务管理切面。这意味着当方法被调用时,Spring AOP 将会拦截这些方法并应用相应的事务行为[^1]。 具体来说,在应用程序启动期间,Spring 容器会识别所有标记有 `@Transactional` 的 bean 方法,并通过 CGLIBJDK 动态代理来增强它们的行为。对于实现了接口的类,默认情况下使用的是 JDK 动态代理;而对于未实现任何接口的情况,则采用 CGLIB 字节码生成技术来进行子类化操作[^3]。 每当一个受保护的操作被执行之前,AOP 切入点会在执行实际业务逻辑前触发前置通知(Before Advice),此时由事务管理器决定是否开启新的事务实例以及设置其传播属性等细节。如果当前线程已经存在活动中的事务上下文,则根据配置好的规则判断如何处理现有事务与即将开始的新事务之间的关系。 一旦完成目标对象内部的工作流程之后,后置处理器负责提交成功结束后的更改或者回滚失败状态下的数据变更。整个过程都依赖于底层平台所提供的功能支持——即 Java EE 提供的标准 JTA API 和本地 JDBC 连接池资源管理服务。 ```java // 示例代码展示了一个简单的 Repository 接口定义及其对应的 Service 实现类, // 并展示了如何利用 @Transactional 来控制数据库交互过程中发生的异常情况。 public interface UserRepository { User findById(Long id); } @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } @Transactional(readOnly = true) public Optional<User> getUserById(Long userId) { try { return Optional.ofNullable(userRepository.findById(userId)); } catch (DataAccessException e) { throw new RuntimeException("Failed to fetch user", e); } } } ``` #### 关键要点总结: - 使用 `@EnableTransactionManagement` 启用了基于注解驱动的方式来进行声明式的事务管理; - 当某个 Bean 上标注了 `@Transactional` 时,它会被自动织入到特定类型的 AOP Proxy 对象之中; - 在每次进入被监控的方法前后都会分别调用 Before/After advice 处理程序,从而确保能够按照预期方式参与事务生命周期件; - 整个机制的核心在于委托给 PlatformTransactionManager 子类去做出关于何时何地创建、挂起还是恢复事务的具体决策。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值