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代理類,從而解決此問題