事务模型与分布式事务总结思考
轉載自?事務模型與分布式事務總結思考
?
1. 介紹
之前了解過一些分布式事務處理的思想,包括MVCC、TCC等。但是對具體實現的規范和約束還不夠理解清晰。本文從事務模型分類來討論常見的事務模型。事務模型的含義,應該指的是我們如何去使用可控制事務。
首先通過以下一張PPT簡單回顧下什么是事務:
2 本地事務模型
?
本地事務模型:不用事務的編程框架來管理事務,直接使用資源管理器來控制事務。典型的就是java.sql.Connection 中的 setAutoCommit、commit、rollback方法,見下面一段代碼,直接使用資源管理器進行事務控制
Connection conn = getConnection();conn.setAutoCommit(false);// do somethingboolean success = doSomething();if (success) {conn.commit();} else {conn.rollback();}```3 編程式事務模型(JTA)
編程式事務模型:就是使用java提供的事務api JTA(Java Transaction API)
和事務服務提供者(一般是指j2ee容器) 進行事務控制,JTA里面提供了 java.transaction.UserTransaction ,里面定義了下面幾個方法
begin:開啟一個事務
commit:提交當前事務
rollback:回滾當前事務
setRollbackOnly:把當前事務標記為回滾
setTransactionTimeout:設置事務的事件,超過這個事件,就拋出異常,回滾事務
getStatus;
?
不過JTA只是提供了一個接口,并沒有提供具體的實現,而是由j2ee服務器提供商 根據JTS規范提供的。下面一段代碼演示了如何使用事務JPA:
?
InitialContext ctx = new InitialContext();UserTransaction ut = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");ut.begin();//do somethingboolean isSuccess = doSomething() ;if(isSuccess){ut.commit();}else{ut.rollback();}JPA規范里面定義了事務相關的幾個角色:1. 事務上下文:事務狀態和屬性信息2. 資源管理器:數據庫連接、JMS連接3. 通信管理器:用在分布式事務里面4. 應用程序:使用事務服務的程序5. 事務管理器:應用程序和事務服務提供者的api接口6. 事務服務提供者:實現了JTA規范的J2EE容器
這個是java里面JPA的規范,但是也有一些編程框架提供了自己的編程事務模型,例如java里最常用的就是spring的事務管理器,下面是spring提供的編程接口:org.springframework.transaction.PlatformTransactionManager,這里面就只有三個方法:
getTransaction:根據屬性信息決定是否開啟事務(具體可以看上一篇文章里面的事務特性小結里面的事務傳播屬性)
commit;提交當前事務
rollback;回滾當前事務
?
我們發現其實和JPA提供的編程模型很像,就是開啟一個事務,提交還是回滾事務。spring提供的事務編程框架也比較簡單
ApplicationContext context = getApplicationContext();TransactionTemplate transactionTemplate = (TransactionTemplate)context.getBean("TransactionTemplate");transactionTemplate.execute(new TransactionCallback() {public Object doInTransaction(TransactionStatus status) {boolean isSuccess = doSomething() ;if(isSuccess){}else{status.setRollbackOnly();}return isSuccess;} });4 聲明式編程(JTA的變種)
?
聲明式編程:這種編程模型不采用硬編碼的方式,而是采用在xml里面進行配置的方式或者使用anotation的方式進行。例如srping里面可以通過aop進行實現。當然本質上也是屬于JPA事務的。只不過對其做了一些分裝。
<bean id="accountService" class="org.springframework.transaction.interceptor. TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="target" ref="accountServiceTarget"/> <property name="transactionAttributes"> <props><prop key="*">PROPAGATION_SUPPORTS</prop> <prop key="update*">PROPAGATION_REQUIRED </prop> </props> </property>```5. DTP事務模型
X/Open Distributed Transaction Processing (DTP) 事務模型實現了XA接口。XA事務指的是實現了XA接口符合DTP事務模型的事務。
DTP事務模型是X/Open 這個組織定義的一套分布式事務的標準,也就是了定義了規范和API接口,由這個廠商進行具體的實現。
DTP事務模型主要用于分布式事務
XA接口規范定義了以下幾個組件:
1. 應用程序(AP):也就是應用程序,可以理解為使用DTP的程序
2.資源管理器(RM):資源管理器,這里可以理解為一個DBMS系統,或者消息服務器管理系統,應用程序通過資源管理器對資源進行控制。資源必須實現XA定義的接口
3.事務管理器(TM):事務管理器,負責協調和管理事務,提供給AP應用程序編程接口以及管理資源管理器
AP、RM、TM三者直接互相的協作關系用下圖表示:
可以看到,其中TM 和 RM 通過XA接口進行雙向通信。AP和TM、RM的通信接口規范沒有約定,可以自己實現。
DTP定義的事務概念:
1. 事務:一個事務是一個完整的工作單元,由多個獨立的計算任務組成,這多個任務在邏輯上是原子的。
2. 全局事務:對于一次性操作多個資源管理器的事務,就是全局事務
3. 分支事務:在全局事務中,某一個資源管理器有自己獨立的任務,這些任務的集合作為這個資源管理器的分支任務
4. 控制線程:用來表示一個工作線程,主要是關聯AP,TM,RM三者的一個線程,也就是事務上下文環境。簡單的說,就是需要標識一個全局事務以及分支事務的關系。
?很多數據庫都實現了DTP事務模型,用于支持分布式事務。
?
5.1 兩階段提交(2PC)
兩階段提交是DTP事務模型的一種實現方式。一個TM控制多個RM,協調資源。
兩階段主要指的是:
第一階段(準備階段):事務管理器通知資源管理器準備分支事務,資源管理器告之事務管理器準備結果
第二階段(提交階段):事務管理器通知資源管理器提交分支事務,資源管理器告之事務管理器結果
5.2 TCC
TCC是一種基于事務補償(屬于事后控制的策略,進行回滾)的模式,注意區別2PC

?
TCC的執行過程
#6 跨域的DTP模型
需要RPC調用,有一些額外的問題。需要引入通信資源管理器。具體看下圖:
?
參考資料:
http://www.cnblogs.com/aigongsi/archive/2012/10/09/2717372.html
http://www.cnblogs.com/lyhabc/p/4902341.html
http://wenku.baidu.com/view/be946bec0975f46527d3e104.html
?
?
?
總結
以上是生活随笔為你收集整理的事务模型与分布式事务总结思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2000元电脑配置推荐(2000的电脑配
- 下一篇: MySQL中的读锁和写锁