Spring 資料庫事務配置
阿新 • • 發佈:2019-01-29
最近在接手公司的一個專案,在其中有涉及到事務回滾的情況,預設情況下在方法上加入@Transactional註解就可以針對在方法內丟擲RuntimeException時進行資料庫回滾,但測試的實際情況沒有達到預期。分析系統配置後發現系統配置了兩個同名的transactionManager bean例項。根據以前對Spring的理解認為Spring中定義了兩個同名的bean肯定會報錯啊,但這裡為什麼沒有任何提示呢?下面就說一下為何沒有提示。
Spring 上下文中定義同名bean
spring對同一配置檔案中相同id或者name的兩個或以上的bean時,做直接拋異常的處理,而對不同配置檔案中相同id或者名稱的bean,只會在列印日誌級別為info的資訊,資訊內容大概為"Overriding bean definition for bean xxx : replacing xxx with beanDefinition "。後面出現的bean定義會覆蓋前面出現的bean定義。這使得問題的排查很困難。Spring DefaultListableBeanFactory.java 中定義了allowBeanDefinitionOverriding 屬性,該屬性的預設值為true。只要將其值改為false就可以達到重複定義bean報錯的目的
在回到一開始的問題,為什麼資料庫事務失效。分析系統後發現,系統配置了兩個資料來源,雖然兩個資料來源指定的事務管理器型別不是同一個型別的,但是由於使用了相同的bean id導致先定義的被覆蓋了,導致對使用前一個事務管理器的資料來源的事務失效了。