當壹個Spring Boot 項目在配置了多個數據源 , 在編寫 Service層方法 的時候 , 直接在service方法的上添加的 @Transactional 直接實現事務管理的方式是失效的 .
以最近接觸到的壹個持久層框架使用的是Jpa的項目為例 , 該項目通過硬編碼(配置類)的方式 , 在項目中配置了兩個不同的數據源 , 所以這個項目分別根據兩個數據源配置了各自的事務管理器 PlatformTransactionManager , 如下 :
第壹個數據源的事務管理器配置類 :
第二個數據源事務管理器配置類 :
可以看到第二個事務管理器的Bean方法上添加了 @Primary 註解 , 所以在通過 PlatformTransactionManager 類型註入事務管理器的bean時 , 默認是根據類型去註入 , 如果該類型有多個 Bean , 如不通過bean的名字去註入 , 則默認是會註入被 @Primary 標識的bean的 ;
所以在這個項目中 , 當在業務層方法添加 @Transactional 註解時 , 默認是調用了 transactionManagerTwo 這個bean , 而我在編寫service層的方法時 , 調用的是第壹個數據源對應的Dao層方法 , 所以直接添加 @Transactional 是不能實現事務管理的 ,
需要在使用 @Transactional 註解時指定使用的事務管理器的bean的名字 , 比如我這裏調用的是第壹個數據源的dao層方法 , 所以需要指定對應的事務管理器 : @Transactional(transactionManager = "transactionManagerOne") .