jtlgb

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

spring 事务机制网上的案例很多,关于事务 不能回滚也有很多的类型,不同的问题有不同的处理方案,本篇博客主要介绍两种事务不能回滚的问题解决方案:

问题一:
    在同一个对象中有两个方法,分别未方法A,方法B(添加了事务),在方法A中调用方法B,出现了事务不能回滚的情况:

/**
* 方法A
*/
public void methodA(){
System.out.println("I an methodA ...");
}
/**
* 方法B
*/
@Transactional
public void methodB(){
System.out.println("I an methodB ...");
//手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}


此时报异常

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
解决方案:新建一个类,将方法B放在新建的类中,定义格式不变,然后在原来的类中调用即可,这是因为spring的事务依赖的是AOP,spring在初始化bean 是生成了一个代理类,在第一个方法中有代理类的存在,调用本类其他方法是是使用的对象本身而不是代理类,故而事务不能回滚。

问题二:
    springboot项目中不知因为什么原因有些service未生成代理类,在启动时:

is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying
虽然此条日志信息时info级别的不影响正常的运行。可是出现此问题的类中service 就是不回滚,不知道此问题的原因,有知道的烦请告知一二,万分感谢。

解决方案:在此类中添加注解  

@Scope(proxyMode = ScopedProxyMode.INTERFACES)
此注解意思是生成一个jdk代理类,从而解决此问题

posted on   jtlgb  阅读(15143)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
 
点击右上角即可分享
微信分享提示