關於Spring Boot 多數據源的事務管理


自己的一些理解:自從用了Spring Boot 以來,這近乎零配置和“約定大於配置”的設計范式用着確實爽,其實對零配置的理解是:應該說可以是零配置可以跑一個簡單的項目,因為Spring Boot 有默認的配置,當默認的配置滿足不了你的時候,這時候所謂的零配置只是換了一種方式而已,我們都知道程序員最擅長的就是寫代碼,相比來說xml文件還是有點蛋疼的; 行啊,Spring Boot說你不是擅長寫代碼,那我就把配置給你轉換為寫代碼的形式,所以你會發現在Spring Boot 中使用@Configuration 、@SpringBootApplication 、@Bean 來通過將一個配置類標記為配置類進行SessionFactory 等的配置,再配合DataSource 就可以不用xml進行配置。

使用Spring Boot 半年以來,基礎的使用掌握的是沒啥問題了,一般的異常也攔不住了,但是稍微深一些的還是自己碰到了為難了才會記憶深刻,理解好一些。 比如 多數據源的事務、分布式的事務管理。 這時候就得用點心了。

下面先對Spring Boot 單數據源情況進行簡單的介紹。先看下圖

 

 

 

 

  

 

Spring Boot本身並不管理事務,只是提供了 PlatformTransactionManager 接口來供持久層實現來達到事務的管理,Spring Boot 默認使用JDBC來控制事務。

在單數據源的情況下我們無需自己管理事務,Spring Boot 默認使用DataSourceTransactionManager 來管理事務,我們所做的只要在程序的service層加上 @Transactional 注解即可使用,這種方式只是適用於單數據源的情況下,但是多數情況下我們都不會只有一個數據源,那么這時候就需要做些工作才能使事務正確的工作了。

第一步:首先我們要為每個數據源創建並指定要使用的事務管理器。也即是在spring boot 的數據源配置類中如下

1 @Bean(name = "entityTx") 2 public DataSourceTransactionManager transactionManager(@Qualifier("entityDataSource") DataSource dataSource) { 3   return new DataSourceTransactionManager(dataSource); 4 }

這里是使用jdbc的事務管理器,將名稱為entityDataSource 的數據源通過方法參數通過構造器交給jdbc事務管理器管理。 這里只是一個數據源的示例,分別在另外的數據源中做相同配置,只是注意@Bean 注解的name 值不能一樣,方法參數注入的數據源作區別即可。

之后在service層加上 @Transactional的 transactionManager屬性或者value屬性 指定為對應的事務管理器名稱即可,也即是@Bean的naem的值,在@Transactional 注解中 transactionManager 屬性和value 屬性互為別名。

這樣做針對操作同一個數據庫用戶下的表具備了事務,但是如果需要將不同數據源的操作納為一個事務中,就需要另外的思路了,因為 DataSourceTransactionManager 事務管理器是不具備這個功能的。這就需要轉到我的下一篇文文章,分布式事務管理

鏈接:https://www.cnblogs.com/qiaoyutao/p/11551045.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM