Spring的編程式事務(wù)和聲明式事務(wù)

事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,當出現(xiàn)異常情況時,它也可以保證數(shù)據(jù)的一致性。

Spring事務(wù)管理的兩種方式

spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。

編程式事務(wù)使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務(wù)管理,spring推薦使用TransactionTemplate。

聲明式事務(wù)是建立在AOP之上的。其本質(zhì)是對方法前后進行攔截,然后在目標方法開始之前創(chuàng)建或者加入一個事務(wù),在執(zhí)行完目標方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。聲明式事務(wù)最大的優(yōu)點就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過基于@Transactional注解的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。

顯然聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,這正是spring倡導(dǎo)的非侵入式的開發(fā)方式。聲明式事務(wù)管理使業(yè)務(wù)代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務(wù)支持。和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是,它的最細粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務(wù)管理的代碼塊獨立為方法等等。

聲明式事務(wù)管理也有兩種常用的方式,一種是基于tx和aop名字空間的xml配置文件,另一種就是基于@Transactional注解。顯然基于注解的方式更簡單易用,更清爽。

spring事務(wù)特性

spring所有的事務(wù)管理策略類都繼承自org.springframework.transaction.PlatformTransactionManager接口。

其中TransactionDefinition接口定義以下特性:

事務(wù)隔離級別

隔離級別是指若干個并發(fā)的事務(wù)之間的隔離程度。TransactionDefinition 接口中定義了五個表示隔離級別的常量:

TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數(shù)據(jù)庫的默認隔離級別。對大部分數(shù)據(jù)庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務(wù)可以讀取另一個事務(wù)修改但還沒有提交的數(shù)據(jù)。該級別不能防止臟讀,不可重復(fù)讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上并沒有此級別。

TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務(wù)只能讀取另一個事務(wù)已經(jīng)提交的數(shù)據(jù)。該級別可以防止臟讀,這也是大多數(shù)情況下的推薦值。

TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務(wù)在整個過程中可以多次重復(fù)執(zhí)行某個查詢,并且每次返回的記錄都相同。該級別可以防止臟讀和不可重復(fù)讀。

TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級別可以防止臟讀、不可重復(fù)讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

事務(wù)傳播行為

所謂事務(wù)的傳播行為是指,如果在開始當前事務(wù)之前,一個事務(wù)上下文已經(jīng)存在,此時有若干選項可以指定一個事務(wù)性方法的執(zhí)行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。這是默認值。

TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個新的事務(wù),如果當前存在事務(wù),則把當前事務(wù)掛起。

TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運行,如果當前存在事務(wù),則把當前事務(wù)掛起。

TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運行,如果當前存在事務(wù),則拋出異常。

TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則拋出異常。

TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務(wù),則創(chuàng)建一個事務(wù)作為當前事務(wù)的嵌套事務(wù)來運行;如果當前沒有事務(wù),則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

事務(wù)超時

所謂事務(wù)超時,就是指一個事務(wù)所允許執(zhí)行的最長時間,如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。

默認設(shè)置為底層事務(wù)系統(tǒng)的超時值,如果底層數(shù)據(jù)庫事務(wù)系統(tǒng)沒有設(shè)置超時值,那么就是none,沒有超時限制。

spring事務(wù)回滾規(guī)則

默認配置下,spring只有在拋出的異常為運行時unchecked異常時才回滾該事務(wù),也就是拋出的異常為RuntimeException的子類(Errors也會導(dǎo)致事務(wù)回滾),而拋出checked異常則不會導(dǎo)致事務(wù)回滾。可以明確的配置在拋出哪些異常時回滾事務(wù),包括checked異常。也可以明確定義那些異常拋出時不回滾事務(wù)。還可以編程性的通過setRollbackOnly()方法來指示一個事務(wù)必須回滾,在調(diào)用完setRollbackOnly()后你所能執(zhí)行的唯一操作就是回滾。

以MyBatis為例,基于注解的聲明式事務(wù)配置

1、添加tx名字空間

xmlns:tx="http://www.springframework.org/schema/tx"

2、開啟事務(wù)的注解支持

<!-- 開啟事務(wù)控制的注解支持 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

3、MyBatis自動參與到spring事務(wù)管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數(shù)據(jù)源與DataSourceTransactionManager引用的數(shù)據(jù)源一致即可。

4、使用@Transactional注解

@Transactional 可以作用于接口、接口方法、類以及類方法上。當作用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時,我們也可以在方法級別使用該注解來覆蓋類級別的定義。

雖然 @Transactional 注解可以作用于接口、接口方法、類以及類方法上,但是 Spring

建議不要在接口或者接口方法上使用該注解,因為這只有在使用基于接口的代理時它才會生效。另外, @Transactional 注解應(yīng)該只被應(yīng)用到

public 方法上,這是由 Spring AOP 的本質(zhì)決定的。如果你在 protected、private 或者默認可見性的方法上使用

@Transactional 注解,這將被忽略,也不會拋出任何異常。

以MyBatis為例,基于.xml文件的聲明式事務(wù)配置

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,當出現(xiàn)異常情況時,它也可以保證數(shù)據(jù)的一致性。 Spring事務(wù)管理的兩種方式...
    nnngu閱讀 676評論 1 2
  • Spring 事務(wù)屬性分析 事務(wù)管理對于企業(yè)應(yīng)用而言至關(guān)重要。它保證了用戶的每一次操作都是可靠的,即便出現(xiàn)了異常的...
    壹點零閱讀 1,380評論 0 2
  • IBM的博文 spring事務(wù)屬性分析: 事務(wù)管理對于企業(yè)應(yīng)用至關(guān)重要.它保證用戶的每一次操作都是可靠的,即便出現(xiàn)...
    Explorer_Mi閱讀 429評論 0 1
  • 事務(wù)有四個特性:ACID 原子性(Atomicity):事務(wù)是一個原子操作,由一系列動作組成。事務(wù)的原子性確保動作...
    jiangmo閱讀 1,293評論 0 7
  • 1 事務(wù) 1.1 事務(wù)管理方式 spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。 編程式事務(wù)管理使用Tra...
    鑫奕航閱讀 2,899評論 0 1

友情鏈接更多精彩內(nèi)容