1. 程式人生 > >Spring 程式設計式事務和申明式事務選擇和使用小結

Spring 程式設計式事務和申明式事務選擇和使用小結

1.選擇程式設計式事務管理還是宣告式事務管理:
    當你只有很少的事務操作時,程式設計式事務管理通常比較合適。例如,如果你有一個Web應用,其中只有特定的更新操作有事務要求,
你可能不願使用Spring或其他技術設定事務代理。這種情況下,使用 TransactionTemplate 可能是個好辦法。 
只有程式設計式事務管理才能顯式的設定事務名稱。 
    另一方面,如果你的應用中存在大量事務操作,那麼宣告式事務管理通常是值得的。它將事務管理與業務邏輯分離, 而且在Spring中配置也不難。
我們的開發中,一般使用到事務的地方比較少,我覺得,程式設計式事務足夠了。
使用宣告式事務,對我們這種對速度要求較高的應用中。反而會帶來效能問題。


2:推薦事務處於一個較高層次,比如service上的某個函式(尤其是像我們這種sns而不像和錢掛鉤的金融系統,對資料精確性要求不是很高的的應用),
而底層的dao可以不考慮事務(一般情況下,資料庫自身的預設事務管理級別,就可以處理),否則可能會出現事務巢狀,增加程式複雜度。
事務往往和業務規緊密關聯,當業務邏輯發生改變,意味著dao的大幅度改動。系統規模達到一定程度,修改風險相當大。
Spring事務的好處是不更改現有的dao,僅需對現有的service bean 進行配置或者儘量少的修改就達到事務效果了。
同時,把事務統一在service層,系統結構更清晰。

一般情況下,通常我們使用到事務的地方一般類似如下場景:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    try {
      updateOperation1();
      updateOperation2();
    } catch (SomeBusinessExeption ex) {
        //通過呼叫 TransactionStatus 物件的 setRollbackOnly() 方法來回滾事務。

      status.setRollbackOnly();
    }
  }
});

只有當兩個操作updateOperation1(),updateOperation2() 同時成功時,才會提交事務,如果有一個操作失敗,則事務回滾,保證資料的完整性。
達到了要麼把事件都執行,要麼都不執行的效果。

像我們現在使用的這種方式:
@Transactional
 public int insert(...) {}
@Transactional
 public int update(...) {}
我覺得可以不使用事務來保證它的正確性,”@Transactional“可以去除。
因為在dao層,而且操作都是針對資料庫的單一操作,要麼操作成功,要麼操作失敗,一般情況下,也不會出現資料不完整。

3 在程式碼中進行程式設計式事務管理:
首先在配置檔案中新增如下兩個bean,
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>    
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager" />
</bean>

public class SimpleService implements Service {
private final TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate){
    .....
}
.....
    //如果需要返回值:
    public Object someServiceMethod() {
        return transactionTemplate.execute(new TransactionCallback() {
          // the code in this method executes in a transactional context
          public Object doInTransaction(TransactionStatus status) {
            updateOperation1();
            return resultOfUpdateOperation2();
          }
        });
      }

    //如果不需要返回值:
    //回撥方法內的程式碼可以通過呼叫 TransactionStatus 物件的 setRollbackOnly() 方法來回滾事務。
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
      protected void doInTransactionWithoutResult(TransactionStatus status) {
        try {
          updateOperation1();
          updateOperation2();
        } catch (SomeBusinessExeption ex) {
          status.setRollbackOnly();
        }
      }
    });
    //諸如傳播模式、隔離等級、超時等等的事務設定都可以在TransactionTemplate中或者通過配置或者程式設計式地實現。如:
     transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
        transactionTemplate.setTimeout(30); // 30 seconds
    <bean id="sharedTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
          <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
          <property name="timeout" value="30"/>
         ......
    </bean>"

}

以上一定要注意,transactionTemplate 對應的資料來源,一定要和updateOperation1();updateOperation2();操作對應的資料來源相同。
如果不是同一個資料來源,就需要JTA 來管理不同資料庫之間的事務處理,情況就比較複雜了。

 4 Spring中事務是比較難理解的一部分,如果大家想了解諸如傳播模式,隔離級別,髒讀,幻讀,不可重複讀等等,推薦一篇文章:

相關推薦

Spring 程式設計事務申明事務選擇使用小結

1.選擇程式設計式事務管理還是宣告式事務管理:    當你只有很少的事務操作時,程式設計式事務管理通常比較合適。例如,如果你有一個Web應用,其中只有特定的更新操作有事務要求,你可能不願使用Spring或其他技術設定事務代理。這種情況下,使用 TransactionTemp

【EfF】 貪婪載入延遲載入 (virtual去掉關閉延遲載入) EntityFramework(EF)貪婪載入延遲載入的選擇使用

EntityFramework(EF)貪婪載入和延遲載入的選擇和使用 貪婪載入:顧名思議就是把所有要載入的東西一 次性讀取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in context.Or

淺談spring事務管理的2種方式:程式設計事務管理宣告事務管理;以及@Transactional(rollbackFor=Exception.class)註解用法

事務的概念,以及特性: 百度百科介紹: ->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過

Spring程式設計事務管理宣告事務管理 案例

       轉賬案例使用了Spring事務管理,用兩種方式實現:程式設計式事務管理和宣告式事物管理。    其中,程式設計式事務管理是一種手動修改程式碼的方式,比較麻煩,在開發過程中很少使用;宣告式事務管理有三種方法實現,分別是TransactionProxyFacto

spring支援程式設計事務管理宣告事務管理兩種方式

1、宣告式事務提交,註解transaction,自動進行事務提交和回滾。    宣告式事務管理也有兩種常用的方式,一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。2、程式設計式事務管理,在程式碼中顯示進行事務提交及回滾。原文:h

Spring程式設計宣告事務例項講解

開發十年,就只剩下這套架構體系了! >>>   

Spring筆記(4) - Spring程式設計事務宣告事務詳解

一.背景 事務管理對於企業應用而言至關重要。它保證了使用者的每一次操作都是可靠的,即便出現了異常的訪問情況,也不至於破壞後臺資料的完整性。就像銀行的自助取款機,通常都能正常為客戶服務,但是也難免遇到操作過程中機器突然出故障的情況,此時,事務就必須確保出故障前對賬戶的操作不生效,就像使用者剛才完全沒有使用過取

Spring 程式設計事務 宣告事務

程式設計式事務通用類: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager

使用Spring程式設計事務TransactionTemplate

使用場景 假如有一個專案設定了資料庫最大連線數為3,然後專案中提供了一個介面,介面中的一個方法會做以下邏輯處理:①首先在資料庫的某個表中查詢出一條記錄,②然後利用該條記錄的資料去調第三方的介面,然後第三方介面放回資料,③最後修改該條記錄的某個欄位的資料然後更新回資料庫。 假設有4個使

spring 程式設計事務spring事務一)

配置檔案 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

事務宣告宣告事務程式設計事務介紹

事務宣告宣告式事務和程式設計式事務介紹 轉載出處 https://blog.csdn.net/u013083576/article/details/51754567 程式設計式事務:所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。管理使用Transacti

手寫Spring註解事務(利用AOP技術 + 註解 + Spring程式設計事務

1.參考下面的文章搭建一個無事務管理的SSM操作資料庫的框架       Spring 使用Druid資料來源 整合 Mybatis 2.AOP技術參考       AOP技術應用實現 3.第一步首先實現Sprin

Spring 申明事務&事務的傳播行為

之前的部落格講述了,為什麼要有事務?https://blog.csdn.net/qq_37591637/article/details/85207922 現在呢?就在原有的基礎上怎麼新增事務,使得整個過程只要有一個地方出問題就失敗,整個過程的成功才叫成功! 換句話說,如果書的庫存夠,賬戶

JdbcTemplate宣告事務Spring框架)

import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.junit.Test;

Spring程式設計事務的使用

引入事務管理器 @Autowired TransactionTemplate transactionTemplate; @Autowired PlatformTransactionManager

Spring的四種事務管理(一種程式設計事務+三種宣告事務

Spring的4種事務管理(1種程式設計式事務+三種宣告事務) 一、Spring事務的介紹 二、程式設計式事務xml的配置 注入後直接在service層呼叫模板的方法使用 三、基於AOP方式的宣告式事務管理 prop的具體配置

筆記——spring基本使用(控制反轉IOC、面向切面程式設計AOP、宣告事務事務隔離級別、事務傳播)

spring溫習筆記 Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。 Spring 的控制反轉IOC、面向切面程式設計AOP等特性不多說。 本文核心內容:搭建一個Spring Dem

Spring的4種事務管理(1種程式設計事務+三種宣告事務

Spring的4種事務管理(1種程式設計式事務+三種宣告事務) ·        TransactionTemplate可以實現程式設計式事務 ·        Spring使用AOP來實現宣告式事務 一、Spring事務的介紹 二、程式設計式事務xml的配置 配置spri

spring 註解 事務宣告事務共存的情況下如何決定先後順序

首先先看配置檔案: [html] view plain copy print?<!– hibernate –>    <beanid=“sessionFactory”        class=“org.springframework.orm.hibernate3.LocalSessi

Spring程式設計事務管理

在基於資料庫的應用中,事務是非常重要的。為了方便使用,Spring提供了基於XML和基於註解的方式配置事務,思路都是使用AOP,在特定的切入點統一開啟事務,以方法為粒度進行事務控制。並且定義了事務的傳播屬性,規定了配置了事務的方法互相巢狀呼叫時的行為準則: PROPAG