事务模型与分布式事务总结思考
轉(zhuǎn)載自?事務(wù)模型與分布式事務(wù)總結(jié)思考
?
1. 介紹
之前了解過一些分布式事務(wù)處理的思想,包括MVCC、TCC等。但是對具體實(shí)現(xiàn)的規(guī)范和約束還不夠理解清晰。本文從事務(wù)模型分類來討論常見的事務(wù)模型。事務(wù)模型的含義,應(yīng)該指的是我們?nèi)绾稳ナ褂每煽刂剖聞?wù)。
首先通過以下一張PPT簡單回顧下什么是事務(wù):
2 本地事務(wù)模型
?
本地事務(wù)模型:不用事務(wù)的編程框架來管理事務(wù),直接使用資源管理器來控制事務(wù)。典型的就是java.sql.Connection 中的 setAutoCommit、commit、rollback方法,見下面一段代碼,直接使用資源管理器進(jìn)行事務(wù)控制
Connection conn = getConnection();conn.setAutoCommit(false);// do somethingboolean success = doSomething();if (success) {conn.commit();} else {conn.rollback();}```3 編程式事務(wù)模型(JTA)
編程式事務(wù)模型:就是使用java提供的事務(wù)api JTA(Java Transaction API)
和事務(wù)服務(wù)提供者(一般是指j2ee容器) 進(jìn)行事務(wù)控制,JTA里面提供了 java.transaction.UserTransaction ,里面定義了下面幾個方法
begin:開啟一個事務(wù)
commit:提交當(dāng)前事務(wù)
rollback:回滾當(dāng)前事務(wù)
setRollbackOnly:把當(dāng)前事務(wù)標(biāo)記為回滾
setTransactionTimeout:設(shè)置事務(wù)的事件,超過這個事件,就拋出異常,回滾事務(wù)
getStatus;
?
不過JTA只是提供了一個接口,并沒有提供具體的實(shí)現(xiàn),而是由j2ee服務(wù)器提供商 根據(jù)JTS規(guī)范提供的。下面一段代碼演示了如何使用事務(wù)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規(guī)范里面定義了事務(wù)相關(guān)的幾個角色:1. 事務(wù)上下文:事務(wù)狀態(tài)和屬性信息2. 資源管理器:數(shù)據(jù)庫連接、JMS連接3. 通信管理器:用在分布式事務(wù)里面4. 應(yīng)用程序:使用事務(wù)服務(wù)的程序5. 事務(wù)管理器:應(yīng)用程序和事務(wù)服務(wù)提供者的api接口6. 事務(wù)服務(wù)提供者:實(shí)現(xiàn)了JTA規(guī)范的J2EE容器
這個是java里面JPA的規(guī)范,但是也有一些編程框架提供了自己的編程事務(wù)模型,例如java里最常用的就是spring的事務(wù)管理器,下面是spring提供的編程接口:org.springframework.transaction.PlatformTransactionManager,這里面就只有三個方法:
getTransaction:根據(jù)屬性信息決定是否開啟事務(wù)(具體可以看上一篇文章里面的事務(wù)特性小結(jié)里面的事務(wù)傳播屬性)
commit;提交當(dāng)前事務(wù)
rollback;回滾當(dāng)前事務(wù)
?
我們發(fā)現(xiàn)其實(shí)和JPA提供的編程模型很像,就是開啟一個事務(wù),提交還是回滾事務(wù)。spring提供的事務(wù)編程框架也比較簡單
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里面進(jìn)行配置的方式或者使用anotation的方式進(jìn)行。例如srping里面可以通過aop進(jìn)行實(shí)現(xiàn)。當(dāng)然本質(zhì)上也是屬于JPA事務(wù)的。只不過對其做了一些分裝。
<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事務(wù)模型
X/Open Distributed Transaction Processing (DTP) 事務(wù)模型實(shí)現(xiàn)了XA接口。XA事務(wù)指的是實(shí)現(xiàn)了XA接口符合DTP事務(wù)模型的事務(wù)。
DTP事務(wù)模型是X/Open 這個組織定義的一套分布式事務(wù)的標(biāo)準(zhǔn),也就是了定義了規(guī)范和API接口,由這個廠商進(jìn)行具體的實(shí)現(xiàn)。
DTP事務(wù)模型主要用于分布式事務(wù)
XA接口規(guī)范定義了以下幾個組件:
1. 應(yīng)用程序(AP):也就是應(yīng)用程序,可以理解為使用DTP的程序
2.資源管理器(RM):資源管理器,這里可以理解為一個DBMS系統(tǒng),或者消息服務(wù)器管理系統(tǒng),應(yīng)用程序通過資源管理器對資源進(jìn)行控制。資源必須實(shí)現(xiàn)XA定義的接口
3.事務(wù)管理器(TM):事務(wù)管理器,負(fù)責(zé)協(xié)調(diào)和管理事務(wù),提供給AP應(yīng)用程序編程接口以及管理資源管理器
AP、RM、TM三者直接互相的協(xié)作關(guān)系用下圖表示:
可以看到,其中TM 和 RM 通過XA接口進(jìn)行雙向通信。AP和TM、RM的通信接口規(guī)范沒有約定,可以自己實(shí)現(xiàn)。
DTP定義的事務(wù)概念:
1. 事務(wù):一個事務(wù)是一個完整的工作單元,由多個獨(dú)立的計(jì)算任務(wù)組成,這多個任務(wù)在邏輯上是原子的。
2. 全局事務(wù):對于一次性操作多個資源管理器的事務(wù),就是全局事務(wù)
3. 分支事務(wù):在全局事務(wù)中,某一個資源管理器有自己獨(dú)立的任務(wù),這些任務(wù)的集合作為這個資源管理器的分支任務(wù)
4. 控制線程:用來表示一個工作線程,主要是關(guān)聯(lián)AP,TM,RM三者的一個線程,也就是事務(wù)上下文環(huán)境。簡單的說,就是需要標(biāo)識一個全局事務(wù)以及分支事務(wù)的關(guān)系。
?很多數(shù)據(jù)庫都實(shí)現(xiàn)了DTP事務(wù)模型,用于支持分布式事務(wù)。
?
5.1 兩階段提交(2PC)
兩階段提交是DTP事務(wù)模型的一種實(shí)現(xiàn)方式。一個TM控制多個RM,協(xié)調(diào)資源。
兩階段主要指的是:
第一階段(準(zhǔn)備階段):事務(wù)管理器通知資源管理器準(zhǔn)備分支事務(wù),資源管理器告之事務(wù)管理器準(zhǔn)備結(jié)果
第二階段(提交階段):事務(wù)管理器通知資源管理器提交分支事務(wù),資源管理器告之事務(wù)管理器結(jié)果
5.2 TCC
TCC是一種基于事務(wù)補(bǔ)償(屬于事后控制的策略,進(jìn)行回滾)的模式,注意區(qū)別2PC

?
TCC的執(zhí)行過程
#6 跨域的DTP模型
需要RPC調(diào)用,有一些額外的問題。需要引入通信資源管理器。具體看下圖:
?
參考資料:
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
?
?
?
總結(jié)
以上是生活随笔為你收集整理的事务模型与分布式事务总结思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2000元电脑配置推荐(2000的电脑配
- 下一篇: 聊下JVM内存模型