Spring的宣告式事務

2021-08-19 18:05:02 字數 2747 閱讀 7830

原文出處:

大多數spring使用者選擇宣告式事務管理的原因是,這個是對應用**影響最小的選擇,因此也最符合非侵入式 輕量級容器的理念。

spring宣告式事務管理可以在任何環境下使用。只需更改配置檔案, 它就可以和jdbc、jdo、hibernate或其他的事務機制一起工作。

spring的宣告式事務管理可以被應用到任何類(以及那個類的例項)上。

spring提供了宣告式的回滾規則。

spring允許你通過aop定製事務行為。(例如,如果需要,你可以在事務回滾中插入定製的行為。 你也可以增加任意的通知,就象事務通知一樣。)。

spring不提供高階應用伺服器提供的跨越遠端呼叫的事務上下文傳播。如果你需要這些特性,我們推薦你使用ejb。 然而,不要輕易使用這些特性。因為通常我們並不希望事務跨越遠端呼叫。

spring的事務管理是通過aop**實現的。 其中的事務通知由元資料(目前基於xml或註解)驅動。 

**物件與事務元資料結合產生了乙個aop**,它使用乙個platformtransactionmanager 介面配合事務***,在方法呼叫前後實施事務。

從概念上來說,在事務**上呼叫方法的工作過程看起來像這樣:

1、首先定義事務性的服務介面:

public inte***ce userservice
2、上面服務的實現類:

public class userserviceimpl implements userservice 

@override

public void deleteuser()

@override

public void updateuser()

@override

public list queryuser()

}

現在假定,userservice的方法(queryuser())必須執行在唯讀事務上下文中,其他的方法(adduser(user user)、deleteuser()和updateuser())必須執行在可讀寫事務上下文中。

下面開始配置spring的配置檔案:

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

我們來分析一下上面的配置。我們要把乙個服務物件(』userservice』 bean)做成事務性的。

我們想施加的事務語義封裝在定義中。 

「把所有以 『query』 開頭的方法看做執行在唯讀事務上下文中, 其餘的方法執行在預設語義的事務上下文中」。

其中的 『transaction-manager』 屬性被設定為乙個指向 platformtransactionmanager bean的名字(這裡指 『transactionmanager』), 該bean將會真正管理事務。

提示

事實上,如果 platformtransactionmanager bean的名字是 『transactionmanager』 的話,你的事務通知()中的 『transaction-manager』 屬性可以忽略。否則你則需要像上例那樣明確指定。

配置中最後一段是的定義, 它確保由 『txadvice』 bean定義的事務通知在應用中合適的點被執行。

首先我們定義了乙個切面,它匹配 userservice 介面定義的所有操作, 我們把該切面叫做 『aopcut』。然後我們用乙個通知器(advisor)把這個切面與 『txadvice』 繫結在一起, 表示當 『aopcut』 執行時,』txadvice』 定義的通知邏輯將被執行。

元素定義是aspectj的切面表示法。

乙個普遍性的需求是讓整個服務層成為事務性的。滿足該需求的最好方式是讓切面表示式匹配服務層的所有操作方法。例如:

現在,既然我們已經分析了整個配置,你可能會問了,「好吧,但是所有這些配置做了什麼?」。

上面的配置將為』userservice』 bean建立乙個**物件,這個**物件被裝配了事務通知,所以當它的相應方法被呼叫時,乙個事務將被啟動、掛起、被標記為唯讀,或者其它(根據該方法所配置的事務語義)。我們來看看下面的測試**,測試一下上面的配置。

userservice userservice = (userservice) context.getbean("userservice");

userservice.deleteuser();

結果:

可以看到spring容器建立了一系列的單例bean,方法deleteuser輸入「輸出使用者」字串。

設定斷點除錯:

可以看到userservice是由spring的jdk動態**生成的**物件。

spring宣告式事務處理的步驟:

搭建環境,引入tx和context命名空間;

在spring的配置檔案中,先導入datasource;

測試datasource是否配置正確;(可省略)

匯入dao和service層的bean

測試dao和service是否配置正確(可省略)

引入事務管理器

配置通知啟用事務通知,將切入點和通知器織入

測試service層的類,看其是否是proxy**物件

Spring宣告式事務

net.sf.hibernate.dialect.oracle9dialect false true net.sf.hibernate.transaction.jdbctransactionfactory 1025 用heibernate來管理事務 當用spring和heibernate一起完成da...

spring宣告式事務

1.什麼是事務 事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性 要麼成功,要麼失敗 2.事務的特性 事務特性分為四個 原子性 atomicity 一致性 consistency 隔離性 isolation 持續性 durability ...

Spring 宣告式事務

propagation 事務傳播機制有如下幾種 required 預設值,表示如果存在乙個事務,則支援當前事務 如果沒有事務,則開啟乙個新事務。requires new 表示總是開啟乙個新的事務,如果乙個事務已經存在,則將這個存在的事務掛起,開啟新事務執行該方法。mandatory 表示如果存在乙個...