宣告式事務管理詳解

2021-09-23 13:25:06 字數 4153 閱讀 4364

spring的事務處理分為兩種:

1、程式設計式事務:在程式中控制事務開始,執行和提交;(不建議使用,所以這裡我就不說明太多)    

2、宣告式事務:在spring配置檔案中對事務進行配置,無須在程式中寫**;(建議使用)

我對」宣告式「的理解是這樣的:spring配置檔案中定義好了這樣乙個規則,

這個規則可以指定對哪些類的哪些方法在執行的時候新增事務控制,並配置好了事務的相關執行屬性,

就是在這些類的這些方法執行的時候隱式地新增事務開始、執行、提交或回滾的**(當然我們看不到)

宣告式事務又分了兩種寫法:

2.1、xml配置檔案

2.2、註解

下面我們首先講解下在xml配置檔案中如何配置宣告式事務管理

<?xml version="1.0" encoding="utf-8"?>

true

true

org.hibernate.dialect.mysql5dialect

false

update

1、建立事務管理器

2、配置通知

屬性必須

預設值 

描述name

是要切入的方法名,可以用萬用字元

propagation

不是required

事務傳播行為

isolation

不是default

事務隔離級別

timeout

不是-1

事務超時的時間(以秒為單位)

read-only

不是false

事務是否唯讀?

rollback-for

不是將被觸發進行回滾的exception(s);以逗號分開。 如:'news.serviceimpl'

no-rollback-for

不是不 被觸發進行回滾的exception(s);以逗號分開。 如:'news.serviceimpl'

3、配置切面表示式, 並且讓 tx與切面表示式合二為一 

我解釋一下execution(* news.service.*.*(..))"中幾個萬用字元的含義:

第乙個 * —— 通配 任意返回值型別

第二個 * —— 通配 包news.service下的任意class

第三個 * —— 通配 包news.service下的任意class的任意方法

第四個 .. —— 通配 方法可以有0個或多個引數

綜上:包news.service下的任意class的具有任意返回值型別、任意數目引數和任意名稱的方法

做到這裡xml方式的事務管理基本就做完了,還差最後一步,那就是匯入它相關的缺包(無論哪種形式的事務管理都要匯入這些包)

最後再給大家講一下註解形式的宣告式事務管理吧

就可以從上面的**中把下面寫的那一大串xml去掉了,

配置切面表示式, 並且讓 tx與切面表示式合二為一

表示式, 定義哪個包的哪些類需要切入事務,但是此處並且沒有制定類中哪些方法,需要切入什麼樣 事務

有人會問,那怎麼才能實現事務管理呢?

很簡單,就不如你的那個類裡面的全部方法都要加入事務管理,就可以直接在此類上面加入乙個@transactional註解就可以了

如果你只想乙個方法加入事務管理,也可以直接單獨在乙個方法上面加入@transactional註解

當然,這個註解還有一些屬性比較常用的

引數名稱功能描述

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

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

指定單一異常類:@transactional(rollbackfor=runtimeexception.class)

指定多個異常類:@transactional(rollbackfor=)

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

指定單一異常類名稱:@transactional(rollbackforclassname="runtimeexception")

指定多個異常類名稱:@transactional(rollbackforclassname=)

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

指定單一異常類:@transactional(norollbackfor=runtimeexception.class)

指定多個異常類:@transactional(norollbackfor=)

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

指定單一異常類名稱:@transactional(norollbackforclassname="runtimeexception")

指定多個異常類名稱:

@transactional(norollbackforclassname=)

propagation該屬性用於設定事務的傳播行為,具體取值可參考下面

例如:@transactional(propagation=propagation.not_supported,readonly=true)

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

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

事物傳播行為介紹:

@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沒有宣告事務,

注意:

在以下情況中spring的事務管理會失效:

● private 方法無法新增事務管理.

● final 方法無法新增事務管理.

● static 方法無法新增事務管理.

● 當繞過**物件, 直接呼叫新增事務管理的方法時, 事務管理將無法生效.

spring 宣告式事務管理詳解

前言 spring框架對於事務管理提供了兩種方案。一,程式設計式事務 二,宣告式事務。本例主要剖析 宣告式事務。何為宣告式事務 通過spring的配置檔案配置事務規則,或使用spring transactional註解兩種方式通知我們系統中哪些方法需要引入事務支援。使用配置檔案配置事務 1 2 3 ...

宣告式事務管理

基於spring的aop的宣告式事務管理 這種管理方式只需要保證事務層方法命名有一定的規律,通過配置即可實現。基於 transational的宣告式事務管理 這種方式的事務管理是基於spring註解實現的,只需要在需要管理的事務層上加上該註解即可。配置註解自動掃瞄 新增註解 transactiona...

Spring宣告式事務管理

使用事務的目的是將整個業務的邏輯處理置於同乙個事務中,方便對整個業務進行管理,如業務的事務回滾 在編寫 時,為了將乙個業務的核心邏輯處理放入事務中,有時會這樣寫 session session sf.opensession 開啟乙個session session.gettransaction beg...