spring宣告式事務管理:基於註解的方式
1)在spring.xml中配置事務管理器DataSourceTransactionManager,
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="defaultDataSource" />
</bean>
2)在spring.xml中開啟註解事務
3)在對應業務層新增@Transactional註解,如<tx:annotation-driven transaction-manager="txManager" />
@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