事務的編程模型
在上一篇文章里面寫了關于事務的一些特性,這里在談談事務的編程模型。什么叫做事務的編程模型,這個問題比較難以回答,其實簡單的一句話,就是我們?nèi)绾稳ナ褂煤涂刂剖聞铡T趈ava平臺里面,有三種事務編程模型:本地事務模型,編程式事務模型,聲明式事務模型(當然我不是太認同這種說法,并不是太準確,不過大體也就這么回事情)
-
本地事務模型
本地事務模型:不用事務的編程框架來管理事務,直接使用資源管理器來控制事務。典型的就是java.sql.Connection 中的 setAutoCommit、commit、rollback方法,見下面一段代碼,直接使用資源管理器進行事務控制
Connection conn = getConnection(); conn.setAutoCommit(false); // do something boolean success = doSomething(); if (success) { conn.commit(); } else { conn.rollback(); }
-
編程式事務模型
編程式事務模型:就是使用java提供的事務api JTA(Java Transaction API)
和事務服務提供者(一般是指j2ee容器) 進行事務控制,JTA里面提供了 java.transaction.UserTransaction ,里面定義了下面幾個方法
begin:開啟一個事務
commit:提交當前事務
rollback:回滾當前事務
setRollbackOnly:把當前事務標記為回滾
setTransactionTimeout:設置事務的事件,超過這個事件,就拋出異常,回滾事務
getStatus;
不過JTA只是提供了一個接口,并沒有提供具體的實現(xiàn),而是由j2ee服務器提供商 根據(jù)JTS規(guī)范提供的。下面一段代碼演示了如何使用事務JPA
InitialContext ctx = new InitialContext(); UserTransaction ut = (UserTransaction) ctx.lookup("javax.transaction.UserTransaction"); ut.begin(); //do something boolean isSuccess = doSomething() ; if(isSuccess){ ut.commit(); }else{ ut.rollback(); }
JPA規(guī)范里面定義了事務相關的幾個角色:事務上下文,資源管理器,通信管理器,應用程序,事務管理器,事務服務提供者。其中資源管理器主要就是我們常見的數(shù)據(jù)庫連接和JMS連接,事務上下文這里可以理解為事務的狀態(tài)和屬性信息,應用程序就是使用事務服務的程序,事務服務提供者就是實現(xiàn)了jta規(guī)范的j2ee容器。事務管理器就是應用程序和事務服務提供者的api接口。通信管理器主要是用在分布式事務里面。
這個是java里面JPA的規(guī)范,但是也有一些編程框架提供了自己的編程事務模型,例如java里最常用的就是spring的事務管理器,下面是spring提供的編程接口:org.springframework.transaction.PlatformTransactionManager,這里面就只有三個方法:
getTransaction:根據(jù)屬性信息決定是否開啟事務(具體可以看上一篇文章里面的事務特性小結里面的事務傳播屬性)
commit;提交當前事務
rollback;回滾當前事務
我們發(fā)現(xiàn)其實和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; } });
-
聲明式編程
聲明式編程:這種編程模型不采用硬編碼的方式,而是采用在xml里面進行配置的方式或者使用anotation的方式進行。例如srping里面可以通過aop進行實現(xiàn)
<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>
以上三種編程模型,第一種比較簡單,也只是適合控制單個資源事務,如果涉及到跨資源(比如兩個數(shù)據(jù)庫連接之間)事務控制,就無能為力了,也就是說不能夠提供分布式事務的解決方案, 而JPA提供了分布式事務的解決方案,這一塊以前了解過,后來忘記了,準備在溫習一下,在整理和總結以下。而spring提供的編程事務模型,則是在局部事務和JPA事務的基礎上提供了一層封裝,統(tǒng)一了兩者的編程模型,也就是說spring其實也提供JPA的編程接口,也就是 JtaTransactionManager,只不過具體實現(xiàn) 委托給jta provider而已。所以基本上編程模型這個劃分還是比較模糊的,直接使用spring提供的編程模型即可。
14年互聯(lián)網(wǎng)技術、產(chǎn)品、運營經(jīng)驗,前支付寶技術專家,互金創(chuàng)業(yè)公司CTO,大令保事業(yè)部總經(jīng)理。
在互金領域有比較強的產(chǎn)品以及運營經(jīng)驗,尤其擅長用戶增長、轉(zhuǎn)化、運營上的經(jīng)驗,兼具技術、產(chǎn)品、運營思維。
目前是云貓增長實驗室 創(chuàng)始人
團隊成員來自阿里等國內(nèi)知名互聯(lián)網(wǎng)公司,曾在互聯(lián)網(wǎng)金融、互聯(lián)網(wǎng)保險、企業(yè)級SaaS等項目中負責用戶增長,團隊管理的工作,擁有豐富的一線流量增長經(jīng)驗與實操手段。
歡迎關注我們,用技術驅(qū)動增長
浙公網(wǎng)安備 33010602011771號