多數據源事務遇到的坑:注解失效問題

問題描述:

  由于工作需要,需要在spring中配置兩個數據源,有一天突然發現@Transactional注解失效

環境框架:

springmvc+spring+spring jdbcTemplate

數據庫:

Oracle數據庫

解決方法:

百度獲得三種可能原因及相應解決方案:

第一種 

1 <!– 自動掃描的包名 –>    
2 <context:component-scan base-package=“com.yxyj” >
3 </context:component-scan>

? ? ? spring容器優先加載由ServletContextListener(對應applicationContext.xml)產生的父容器,而SpringMVC(對應mvc_dispatcher_servlet.xml)產生的是子容器。子容器Controller進行掃描裝配時裝配的@Service注解的實例是沒有經過事務加強處理,即沒有事務處理能力的Service,而父容器進行初始化的Service是保證事務的增強處理能力的。如果不在子容器中將Service exclude掉,此時得到的將是原樣的無事務處理能力的Service。

springmvc的配置文件里包掃描范圍太大,應該將service排除在外

第二種

使用的mysql數據庫,數據庫引擎使用的不是InnoDB,只要切換成InnoDB就可以了

1 alter table tablename type=InnoDb

第三種

注解加的方法權限修飾符不是public,@Transational失效,修改修飾符為public

結果是,我的注解掃描范圍只有controller層,所以第一種方案失敗,數據庫是Oracle數據庫,第二種解決方案失敗,方法權限修飾符就是public,第三種方案失敗......

接下來,繼續查找原因,然后了解到原來事務是和數據源綁定的,如果不給事務管理器qualifer屬性,@Transactional默認會與第一個事務管理器綁定,結果我用的是第二個數據源,導致Transactional失效

解決方案:

配置事務管理器時添加value區分字段

java代碼中添加value

1 @Transactional(value = "ynw")
2 public HashMap<String, Object> addAppointMent(Map map) {}

這樣事務就可以使用了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,946評論 6 342
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • objective-c unit test - OCMockライブラリ 最近一つiOSの単體テストライブラリを勉強...
    Chinajmz閱讀 382評論 0 3
  • 在優酷上看到一段在2016年4月23號“世界讀書日”,羅輯思維創始人羅振宇、錘子科技CEO羅永浩、大象公會創始人黃...
    驢背上的精進閱讀 3,090評論 0 3
  • 黑幫片里總有這樣的橋段——黑道大哥一生打打殺殺,厭倦了江湖生活,想金盆洗手從此不問江湖事。手下們紛紛勸留,撕心裂肺...
    威廉汪閱讀 225評論 0 0