原文出處:
大多數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 表示如果存在乙個...