1. 程式人生 > >spring宣告式事務管理:基於註解的方式

spring宣告式事務管理:基於註解的方式

1)在spring.xml中配置事務管理器DataSourceTransactionManager,

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="defaultDataSource" />
</bean>

2)在spring.xml中開啟註解事務
<tx:annotation-driven transaction-manager="txManager" />
3)在對應業務層新增@Transactional註解,如

@Service
@Transactional
public class UserAllInPayLogic {

事物註解方式: @Transactional

當標於類前時, 標示類中所有方法都進行事物處理 , 例子:

1 @Transactional public class TestServiceBean implements TestService {}

當類中某些方法不需要事物時:

複製程式碼
 1 @Transactional  
 2 public class TestServiceBean implements TestService { 
 3
private TestDao dao; 4 public void setDao(TestDao dao) { 5 this.dao = dao; 6 } 7 @Transactional(propagation =Propagation.NOT_SUPPORTED) 8 public List getAll() { 9 return null; 10 } 11 }
複製程式碼

事物傳播行為介紹: 

  @Transactional(propagation=Propagation.REQUIRED) :如果有事務, 那麼加入事務, 沒有的話新建一個(預設情況下

)
  @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個方法開啟事務
  @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
  @Transactional(propagation=Propagation.MANDATORY) :必須在一個已有的事務中執行,否則丟擲異常
  @Transactional(propagation=Propagation.NEVER) :必須在一個沒有的事務中執行,否則丟擲異常(與Propagation.MANDATORY相反)
  @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.

事物超時設定:

 @Transactional(timeout=30) //預設是30秒

事務隔離級別:

  @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交資料(會出現髒讀, 不可重複讀) 基本不使用
  @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交資料(會出現不可重複讀和幻讀)
  @Transactional(isolation = Isolation.REPEATABLE_READ):可重複讀(會出現幻讀)
  @Transactional(isolation = Isolation.SERIALIZABLE):序列化

  MYSQL:預設為REPEATABLE_READ級別
  oracle,SQLSERVER: 預設為READ_COMMITTED

髒讀 : 一個事務讀取到另一事務未提交的更新資料
不可重複讀 : 在同一事務中, 多次讀取同一資料返回的結果有所不同, 換句話說, 
後續讀取可以讀到另一事務已提交的更新資料. 相反, "可重複讀"在同一事務中多次
讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料
幻讀 : 一個事務讀到另一個事務已提交的insert資料

@Transactional註解中常用引數說明

引數名稱

功能描述

readOnly

該屬性用於設定當前事務是否為只讀事務,設定為true表示只讀,false則表示可讀寫,預設值為false。例如:@Transactional(readOnly=true)

rollbackFor

該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。例如:

指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)

指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName

該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾。例如:

指定單一異常類名稱:@Transactional(rollbackForClassName="RuntimeException")

指定多個異常類名稱:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

該屬性用於設定不需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,不進行事務回滾。例如:

指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)

指定多個異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

該屬性用於設定不需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,不進行事務回滾。例如:

指定單一異常類名稱:@Transactional(noRollbackForClassName="RuntimeException")

指定多個異常類名稱:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

該屬性用於設定事務的傳播行為,具體取值可參考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理多事務併發的情況,通常使用資料庫的預設隔離級別即可,基本不需要進行設定

timeout

該屬性用於設定事務的超時秒數,預設值為-1表示永不超時

注意的幾點:


  1、@Transactional 只能被應用到public方法上, 對於其它非public的方法,如果標記了@Transactional也不會報錯,但方法沒有事務功能.

  2、用 spring 事務管理器,由spring來負責資料庫的開啟,提交,回滾.預設遇到執行期例外(throw new RuntimeException("註釋");)會回滾,即遇到不受檢查(unchecked)的例外時回滾;而遇到需要捕獲的例外(throw new Exception("註釋");)不會回滾,即遇到受檢查的例外(就是非執行時丟擲的異常,編譯器會檢查到的異常叫受檢查例外或說受檢查異常)時,需我們指定方式來讓事務回滾要想所有異常都回滾,要加上 @Transactional( rollbackFor={Exception.class,其它異常}) .如果讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
如下:

複製程式碼
1 @Transactional(rollbackFor=Exception.class) //指定回滾,遇到異常Exception時回滾
2 public void methodName() {
3    throw new Exception("註釋");
4 }
5 @Transactional(noRollbackFor=Exception.class)//指定不回滾,遇到執行期例外(throw new RuntimeException("註釋");)會回滾
6 public ItimDaoImpl getItemDaoImpl() {
7    throw new RuntimeException("註釋");
8 }
複製程式碼

  3、@Transactional 註解應該只被應用到 public 可見度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 註解,它也不會報錯, 但是這個被註解的方法將不會展示已配置的事務設定。


  4、@Transactional 註解可以被應用於介面定義和介面方法、類定義和類的 public 方法上。然而,請注意僅僅 @Transactional 註解的出現不足於開啟事務行為,它僅僅 是一種元資料,能夠被可以識別 @Transactional 註解和上述的配置適當的具有事務行為的beans所使用。上面的例子中,其實正是 元素的出現 開啟 了事務行為。


  5、Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何介面上。你當然可以在介面上使用 @Transactional 註解,但是這將只能當你設定了基於介面的代理時它才生效。因為註解是不能繼承的,這就意味著如果你正在使用基於類的代理時,那麼事務的設定將不能被基於類的代理所識別,而且物件也將不會被事務代理所包裝(將被確認為嚴重的)。因此,請接受Spring團隊的建議並且在具體的類上使用 @Transactional 註解。

相關推薦

spring宣告事務管理基於註解方式

1)在spring.xml中配置事務管理器DataSourceTransactionManager,<bean id="txManager" class="org.springframework.

宣告事務管理三:基於註解的配置

這種基於註解配置的宣告式事務管理方法式很簡單,很方便              (1) 像之前一樣恢復到初始狀態 (2) 配置事務管理器(注入連線池)       (3) 開啟註解

spring事務管理之二宣告事務管理使用代理方式

spring宣告式事務管理,分為三種方式,分別是: 1、使用代理類TransactionProxyFactoryBean的方式 2、使用aspectj+xml配置的方式 3、使用事務註解的方式 其中後面兩種是比較常用的,使用xml和註解的方式。 這裡介紹使用代理類Transa

第十二講12,spring宣告事務管理-註解

1,複製專案spring404 ,改名spring404-3。修改BankServiceImpl類,添加註解,package com.cruise.service.impl;import org.springframework.transaction.annotation.Tra

spring事物配置,宣告事務管理基於@Transactional註解的使用

spring支援程式設計式事務管理和宣告式事務管理兩種方式。         程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用Transactio

spring事務管理之四宣告事務管理使用事務註解方式

事務註解的方式,相對xml的方式來說,有優點,無需配置需要事務的業務方法的切點和事務屬性。但是也有缺點,就是需要在每個需要事務的業務方法上加上一個註解@Transaction,否則事務不會生效。 這裡沿用之前spring事務管理的程式碼: pom.xml依賴部分: <depen

第十一講11.spring宣告事務管理-xml方式

1,複製專案spring404 ,改名spring404-2,修改BankServiceImpl類,刪除宣告式事務的程式碼。宣告式事務管理的方式缺點是,事務程式碼嚴重嵌入邏輯程式碼中 package com.cruise.service.impl; import org.springframewor

spring宣告事務管理方式( 基於tx和aop名字空間的xml配置[email&#

轉自:https://www.cnblogs.com/niceyoo/p/8732891.html 1. 宣告式事務管理分類 宣告式事務管理也有兩種常用的方式, 一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。 顯然基於註解的方式更簡單

spring事務管理之三宣告事務管理使用xml配置檔案的方式

這種方式是開發中常見的一種方式:利用aop的思想,將需要事務管理的業務方法通過xml配置的方式,將事務管理加在該類的相關方法上。這種方法的優點是,一次xml配置,後期不用關心業務類增加或者減少,通過xml中配置的匹配資訊,會去找業務類所在的包和方法,然後加上事務。 重點是配置<tx:a

spring 宣告事務管理註解方式實現

使用註解實現Spring的宣告式事務管理,更加簡單! 步驟:          1) 必須引入Aop相關的jar檔案          2) bean.xml中指定註解方式實現宣告式事務管理以及應用的事務管理器類          3)在需要新增事務控制的地方,寫上: @T

宣告事務管理二:基於AspectJ的xml配置

下面講述的是宣告式事務管理的第二種方法,是基於AspectJ的xml配置的       (1) 引入AspectJ的java包(一種簡化的操作)並copy到web-INF       (2) 配置事務管理器   &n

Spring宣告事務管理事務的傳播行為xml配置

 1. <tx:method name="insert*" propagation="REQUIRED" />中name的值是ServiceImpl中各個要加入事物管理的方法的方法名。 <!-- 事務管理: Spring宣告式事務管理 。

Spring宣告事務管理事務巢狀

一>  事務配置 Spring動態代理的一個重要特徵是,它是針對介面的,所以我們的dao要通過動態代理來讓spring接管事務,就必須在dao前面抽象出一個介面,當然如果沒有這樣的介面,那麼spring會使用CGLIB來解決問題。     一般地,使用Spri

Spring宣告事務管理原始碼解析

核心介面 1. PlatformTransactionManager:事務管理器頂級介面:各持久化框架要想接入Spring的事務管理,必須自行提供該介面實現 2. TransactionDefinition:事務的屬性頂級介面:其實現類封裝事務隔離級別、

淺談Spring宣告事務管理ThreadLocal和JDKProxy

寫這篇文章的目的,為了使大家更好的理解和摸清事務的規律,希望對新手學習事務這塊內容時有所幫助。    在我們開發一個應用時,很多時候我們的一個業務操作會對資料庫進行多次操作,有時候我們需要保證這麼一系列的操作要麼全部成功,要麼全部失敗,其實這個這個概念就是我們今天要談論的事務。       現在我們開發應用

Spring宣告事務管理與配置介紹

一、Spring宣告式事務配置的五種方式 前段時間對Spring的事務配置做了比較深入的研究,在此之間對Spring的事務配置雖說也配置過,但是一直沒有一個清楚的認識。通過這次的學習發覺Spring的事務配置只要把思路理清,還是比較好掌握的。 總結如下: Sprin

Spring宣告事務(AOP的tx方式

類似於上一篇,這裡使用tx的方式來配置。 服務類StudentService.java程式碼如下: package com.mysrc.service; import java.sql.Date; import java.util.List; import com.m

深入解讀Spring Framework事務管理(第四彈基於@Transactional註解宣告事務管理

基於註解的宣告式事務,主要使用的是@Transactional註解,下面我們來具體看一下。 使用@Transactional註解實現事務的例子 // 這個service我們要將他事務化 @Transactional public class Defa

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

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

宣告事務管理方式基於AspectJ的XML方式基於註解方式

基於AspectJ的XML方式 <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataS