分佈式事務

轉載:http://javatar.iteye.com/blog/981787

關於Dubbo服務框架的分佈式事務,雖然現在不急着做,但可以討論一下。 


我覺得事務的管理不應該屬於Dubbo框架, 
Dubbo只需實現可被事務管理即可, 
像JDBC和JMS都是可被事務管理的分佈式資源, 
Dubbo只要實現相同的可被事務管理的行爲,比如可以回滾, 
其它事務的調度,都應該由專門的事務管理器實現。 

在Java中,分佈式事務主要的規範是JTA/XA, 
其中:JTA是Java的事務管理器規範, 
XA是工業標準的X/Open CAE規範,可被兩階段提交及回滾的事務資源定義, 
比如某數據庫實現了XA規範,則不管是JTA,還是MSDTC,都可以基於同樣的行爲對該數據庫進行事務處理。 

在JTA/XA中,主要有兩個擴展點: 

(1) TransactionManager 
JTA事務管理器接口,實現該接口,即可完成對所有XA資源的事務調度,比如BEA的Tuxedo,JBossJTA等。 

(2) XAResource 
XA資源接口,實現該接口,即可被任意TransactionManager調度,比如:JDBC的XAConnection,JMS的XAMQ等。 

而Dubbo的遠程服務,也應該是一個XAResource,比如:XAInvoker和XAExporter, 
Dubbo只需在第一次提交時,將請求發到服務提供方進行緩存和寫盤, 
在第二次提交時,再基於緩存調用服務的Impl實現, 
當然一些健狀性分支流程要考慮清楚。 

JTA/XA的基本原理如下: 

 

1. 用戶啓動一個事務: 
Java代碼  收藏代碼
  1. transactionManager.begin();   


2. 事務管理器在當前線程中初始化一個事務實例: 
Java代碼  收藏代碼
  1. threadLocal.set(new TransactionImpl());  


3. 用戶調用JDBC或JMS或Dubbo請求,請求內部初始化一個XAResource實例: 
Java代碼  收藏代碼
  1. XAResource xaResource = new XAResourceImpl(); // 比如:XAConnection  


4. JDBC或JMS或Dubbo內部從當前線程獲取事務: 
Java代碼  收藏代碼
  1. Transaction transaction = transactionManager.getTransaction(); // 其內部爲:threadLocal.get();  


5. 將當前XAResource註冊到事務中: 
Java代碼  收藏代碼
  1. transaction.enlistResource(xaResource);  


6. 用戶提交一個事務: 
Java代碼  收藏代碼
  1. transactionManager.commit(); // 其內部爲:getTransaction().commit();  


7. 事務for循環調用所有註冊的XAResource的兩階段提交: 
Java代碼  收藏代碼
  1. Xid xid = new XidImpl();  
  2. for (XAResource xaResource: xaResources) {  
  3. xaResource.prepare(xid);  
  4. xaResource.commit(xid, true);  
  5. xaResource.commit(xid, false);  
  6. }  


8. 當然,還有一些異常流程,比如rollback和forget等。 

舉例: 
Java代碼  收藏代碼
  1. TransactionManager transactionManager = ...; // 從JNDI進行lookup等方式獲取  
  2. transactionManager.begin(); // 啓動事務  
  3. try {  
  4.     jdbcConn.executeUpdate(sql); // 執行SQL語句,DB寫入binlog,但不更新表  
  5.     jmsMQ.send(message); // 發送消息,MQ記錄消息,但不進入隊列  
  6.     dubboService.invoke(parameters); // 調用遠程服務,Provider緩存請求信息,但不執行  
  7.     transactionManager.commit(); // 提交事務,數據庫,消息隊列,遠程服務同時提交  
  8. catch(Throwable t) {  
  9.     transactionManager.rollback(); // 回滾事務,數據庫,消息隊列,遠程服務同時回滾  
  10. }  
發佈了18 篇原創文章 · 獲贊 152 · 訪問量 125萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章