[解決] spring service 呼叫當前類方法事務不生效
今天在測試框架的時候,我想在一個service類的方法中呼叫 當前類的另一個方法(該方法透過@Transactional
開啟事務),這時候發現被呼叫類的事務並沒有生效。
public boolean test1() { // xxx 業務邏輯 return test2(); } @Transactional public boolean test2() { testMapper.insertSalary("test", UUID.randomUUID().toString()); int a = 10/0; return true; }
WHY? 搜尋引擎一番查詢之後,瞭解到問題的關鍵:
@Transactional 是基於aop生的代理物件開啟事務的
PS:不瞭解代理模式的小夥伴,結尾有傳送門
思路
1.spring 的事務是透過 aop 管理的
2.aop 會透過動態代理 為我們生成代理物件,aop 的功能(例如事務)都是在代理物件中實現的
aop 生成的代理類又在 spring 容器中,所以我們只要在 spring 容器中拿到當前這個bean 再去呼叫
test2()
就可以開啟事務了。
解決
import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;/** * Spring的ApplicationContext的持有者,可以用靜態方法的方式獲取spring容器中的bean * */@Componentpublic class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextHolder.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { assertApplicationContext(); return applicationContext; } @SuppressWarnings("unchecked") public static <T> T getBean(String beanName) { assertApplicationContext(); return (T) applicationContext.getBean(beanName); } public static <T> T getBean(Class<T> requiredType) { assertApplicationContext(); return applicationContext.getBean(requiredType); } private static void assertApplicationContext() { if (SpringContextHolder.applicationContext == null) { throw new RuntimeException("applicaitonContext屬性為null,請檢查是否注入了SpringContextHolder!"); } } }
public boolean test1() { // xxx 業務邏輯 // 在spring容器中 獲取當前類的代理類 return SpringContextHolder.getBean(TestS.class).test2(); } @Transactional public boolean test2() { testMapper.insertSalary("test", UUID.randomUUID().toString()); int a = 10/0; return true; }
作者:殷天文
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2815942/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring中同一個service中方法相互呼叫事務不生效問題解決方案Spring
- Service呼叫其他Service的private方法, @Transactional會生效嗎(上)
- Spring AOP呼叫本類方法沒有生效的問題Spring
- spring cloud gateway 不生效SpringCloudGateway
- 解決Selenium元素拖拽不生效Bug
- spring多資料來源下 事務不生效Spring
- sonar掃描出關於同個類中呼叫本類的@Transactional修飾方法時,註解不生效
- js程式碼不生效的解決方案JS
- vuejs鍵盤事件不生效解決方式VueJS事件
- vue scoped 解決樣式不生效問題Vue
- 淺談,seata在使用feign-url通過域名呼叫時分散式事務不生效的問題及解決分散式
- mysql5 7配置不生效解決記錄MySql
- 解決text-overflow: ellipsis;不生效的問題
- Homestead 12.1.0 + VsCode Xdebug不生效的解決辦法VSCode
- 美團二面:spring事務不生效的15種場景Spring
- element-UI更改樣式不生效的解決方法UI
- git 解決衝突 —— git stash 當前修改Git
- SSH在呼叫Service時獲取為空-解決辦法
- Spring基礎系列-Spring事務不生效的問題與迴圈依賴問題Spring
- 技術分享 | DNS解析不生效的原因及解決方法DNS
- 解決spring cloud Feign遠端呼叫服務,新增headers解決攔截器攔截問題SpringCloudHeader
- 域名解析不生效,中科三方帶你定位!
- 獲取類屬性值,當前類,父類
- Idea實體類上加@Data註解但get/set方法不生效Idea
- el-autocomplete的popper-class不生效的解決辦法?
- 日常git使用中,遇見.gitignore 配置不生效,解決辦法Git
- 完蛋,我的事務怎麼不生效?
- shiro多Realm第一次呼叫不生效問題
- spring.jackson.default-property-inclusion 不生效問題分析Spring
- maven,環境指定不生效,profiles指定不生效Maven
- 域名管理常見問題:域名解析不生效的原因和解決方法(中科三方)
- docker下mysql連線數修改後不生效問題的解決DockerMySql
- tailwindcss不生效AICSS
- StrictSlash不生效
- 定時任務裡面事務不生效問題
- 【解決方案】當前不會命中斷點,還沒有為該文件載入任何符號斷點符號
- “當前不會命中斷點 還沒有為該文件載入任何符號”解決方法斷點符號
- vue使用iview或者element-ui元件修改樣式不生效解決方法VueViewUI元件