spring boot 或 spring 集成 atomikos jta 完成多數據源事務管理


前言:對於事務,spring 不提供自己的實現,只是定義了一個接口來供其他廠商實現,具體些的請看我的這篇文章: https://www.cnblogs.com/qiaoyutao/p/11289996.html

常用的有 jdbc 的DataSourceTransactionManager  , Hibernate的 HibernateTransactionManager  , jta的 JtaTransactionManager 。  但是如果要實現分布式的事務管理就需要借助 atomikos 插件了。

首先說一下什么是分布式:

  集中式: 就是一個項目就是一個獨立的應用,這個項目中包含了各個子模塊,比如,郵件功能、文件上傳功能等等。最多也就是多部署幾個服務器,前面擋上負載均衡來平衡系統負載。

    缺點:不易拓展、更新一個功能就需要重新部署整個項目。 一個子模塊出問題就可能影響整個系統的。

    優點:對於開發、測試、運維會比較方便,不用考慮復雜的分布式環境。

  分布式:也就是 若干個 獨立功能的計算機的組合,通常做法就是針對一個系統,將系統中的各個業務模塊分離開來分別部署到不同的計算機上,來配合工作使系統正常運轉的一種系統部署方式,如果某個業務模塊負載較高那么就增                          加服務器並擋上負載均衡來緩解壓力,但多個服務器仍然是只提供一個業務模塊的功能。 但是對於用戶是感覺不到的。

    缺點: 對於開發、測試、運維 要考慮復雜的分布式環境,比如分布式事務、分布式鎖等。

    優點: 項目的各功能模塊獨立分開,一個模塊更新不影響其他模塊。

下面先說無xml的配置方式,因為用的是spring boot 實在是不想添加xml配置。

前奏操作: 因為atomikos管理事務是基於 dblink 來實現的,所以要先 以dba角色登錄oracle 數據庫,通常用戶名為 system或者sys    來開啟dblink權限。語句如下

GRANT SELECT ON sys.dba_pending_transactions TO PROD_METADATA;
GRANT SELECT ON sys.pending_trans$ TO PROD_METADATA;
GRANT SELECT ON sys.dba_2pc_pending TO PROD_METADATA;
GRANT EXECUTE ON sys.dbms_xa TO PROD_METADATA;
GRANT FORCE ANY TRANSACTION TO PROD_METADATA;
GRANT EXECUTE ON sys.dbms_system TO PROD_METADATA;

其中 PROD_METADATA 是涉及到分布式事務的用戶名,涉及到分布式事務的用戶都要開啟。

 

新建 atomikos 的配置列,創建atomikos 事務管理器示例並交給spring 的JtaTransactionManager 管理

 

 1 @Configuration  2 public class AtomikosTxManagerConfig {  3     
 4     @Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")  5     public TransactionManager atomikosTransactionManager() {  6         UserTransactionManager userTransactionManager = new UserTransactionManager();  7         userTransactionManager.setForceShutdown(true);  8         return userTransactionManager;  9  } 10     
11     @Bean(name = "userTransaction") 12     public UserTransaction userTransaction() throws SystemException { 13         UserTransactionImp userTransactionImp = new UserTransactionImp(); 14         userTransactionImp.setTransactionTimeout(1800000); 15         return userTransactionImp; 16  } 17     
18     @Bean(name = "txManager") 19     public PlatformTransactionManager txManager() throws SystemException { 20         UserTransaction userTransaction = userTransaction(); 21         TransactionManager transactionManager = atomikosTransactionManager(); 22         return new JtaTransactionManager(userTransaction, transactionManager); 23  } 24 }

 

上面代碼已經創建了 名稱為 taManager的分布式事務管理器,使用的時候再service 層添加注解 @Transactional(transactionManager = "txManager", rollbackFor = Exception.class)  transactionManager屬性指明要使員工的管理器, rollbackFor 指明在什么情況下觸發事務回滾。

當然了,如果不是spring boot ,而是spring 那么就需要進行用xml方式進行aop 配置或者用注解來實現aop事務,xml配置示例如下。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4  xmlns:aop="http://www.springframework.org/schema/aop"
 5  xmlns:tx="http://www.springframework.org/schema/tx"
 6  xsi:schemaLocation="http://www.springframework.org/schema/beans  7  http://www.springframework.org/schema/beans/spring-beans.xsd  8  http://www.springframework.org/schema/tx  9  http://www.springframework.org/schema/tx/spring-tx.xsd 10  http://www.springframework.org/schema/aop 11  http://www.springframework.org/schema/aop/spring-aop.xsd">
12 
13     <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
14         <property name="transactionManager">
15             <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
16                 <property name="forceShutdown" value="true"/>
17             </bean>
18         </property>
19         <property name="userTransaction">
20             <bean class="com.atomikos.icatch.jta.UserTransactionImp">
21                 <property name="transactionTimeout" value="1200"/>
22             </bean>
23         </property>
24     </bean>
25     
26     <tx:advice id="txAdvice" transaction-manager="txManager">
27         <tx:attributes>
28             <tx:method name="persistent*" propagation="REQUIRED" rollback-for="Exception"/>
29             <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
30             <tx:method name="*" read-only="true"/>
31         </tx:attributes>
32     </tx:advice>
33     
34     <aop:config>
35         <aop:pointcut id="serviceMethods" expression="execution(* com.wisdombud.dama.retl.sync.DataHandling*.*(..))"/>
36         <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
37     </aop:config>
38 </beans>

然后再通過@ImportResource("classpath:tx.xml")注解  導入配置文件到sping 上下文容器中即可。

 

 

   

  


免責聲明!

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



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