事務的編程模型


在上一篇文章里面寫了關於事務的一些特性,這里在談談事務的編程模型。什么叫做事務的編程模型,這個問題比較難以回答,其實簡單的一句話,就是我們如何去使用和控制事務。在java平台里面,有三種事務編程模型:本地事務模型,編程式事務模型,聲明式事務模型(當然我不是太認同這種說法,並不是太准確,不過大體也就這么回事情)

 

  • 本地事務模型

本地事務模型:不用事務的編程框架來管理事務,直接使用資源管理器來控制事務。典型的就是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只是提供了一個接口,並沒有提供具體的實現,而是由j2ee服務器提供商 根據JTS規范提供的。下面一段代碼演示了如何使用事務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規范里面定義了事務相關的幾個角色:事務上下文,資源管理器,通信管理器,應用程序,事務管理器,事務服務提供者。其中資源管理器主要就是我們常見的數據庫連接和JMS連接,事務上下文這里可以理解為事務的狀態和屬性信息,應用程序就是使用事務服務的程序,事務服務提供者就是實現了jta規范的j2ee容器。事務管理器就是應用程序和事務服務提供者的api接口。通信管理器主要是用在分布式事務里面。

這個是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;
            }    
        });

 

  • 聲明式編程

聲明式編程:這種編程模型不采用硬編碼的方式,而是采用在xml里面進行配置的方式或者使用anotation的方式進行。例如srping里面可以通過aop進行實現

<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>

 

以上三種編程模型,第一種比較簡單,也只是適合控制單個資源事務,如果涉及到跨資源(比如兩個數據庫連接之間)事務控制,就無能為力了,也就是說不能夠提供分布式事務的解決方案, 而JPA提供了分布式事務的解決方案,這一塊以前了解過,后來忘記了,准備在溫習一下,在整理和總結以下。而spring提供的編程事務模型,則是在局部事務和JPA事務的基礎上提供了一層封裝,統一了兩者的編程模型,也就是說spring其實也提供JPA的編程接口,也就是 JtaTransactionManager,只不過具體實現 委托給jta provider而已。所以基本上編程模型這個划分還是比較模糊的,直接使用spring提供的編程模型即可。


免責聲明!

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



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