spring事務配置的兩種方式:
1.基於XML的事務配置。2.基於注解方式的事務配置。
前言:在我們詳細介紹spring的兩種聲明式事務管理之前,我們需要先理解這些概念
正文:
1.基於XMl的事務配置
package x.y.service; public interface FooService { Foo getFoo(String fooName); Foo getFoo(String fooName, String barName); void insertFoo(Foo foo); void updateFoo(Foo foo); }
<tx:advice/> 有關的設置
通過 <tx:advice/> 標簽來指定不同的事務性設置。默認的 <tx:advice/> 設置如下:
事務傳播設置是 REQUIRED
隔離級別是DEFAULT
事務是 讀/寫
事務超時默認是依賴於事務系統的,或者事務超時沒有被支持。
任何 RuntimeException 將觸發事務回滾,但是任何 checked Exception 將不觸發事務回滾
這些默認的設置當然也是可以被改變的。 <tx:advice/> 和 <tx:attributes/> 標簽里的 <tx:method/> 各種屬性設置總結如下:
屬性 |
是否需要? |
默認值 |
描述 |
name |
是 |
與事務屬性關聯的方法名。通配符(*)可以用來指定一批關聯到相同的事務屬性的方法。 如:'get*'、'handle*'、'on*Event'等等。 |
|
propagation |
不 |
REQUIRED |
事務傳播行為 |
isolation |
不 |
DEFAULT |
事務隔離級別 |
timeout |
不 |
-1 |
事務超時的時間(以秒為單位) |
read-only |
不 |
false |
事務是否只讀? |
rollback-for |
不 |
將被觸發進行回滾的 Exception(s);以逗號分開。 如:'com.foo.MyBusinessException,ServletException' |
|
no-rollback-for |
不 |
不 被觸發進行回滾的 Exception(s);以逗號分開。 如:'com.foo.MyBusinessException,ServletException' |
下面我們具體來看一下事務的傳播性的幾個值:
REQUIRED:業務方法需要在一個容器里運行。如果方法運行時,已經處在一個事務中,那么加入到這個事務,否則自己新建一個新的事務。
NOT_SUPPORTED:聲明方法不需要事務。如果方法沒有關聯到一個事務,容器不會為他開啟事務,如果方法在一個事務中被調用,該事務會被掛起,調用結束后,原先的事務會恢復執行。
REQUIRESNEW:不管是否存在事務,該方法總匯為自己發起一個新的事務。如果方法已經運行在一個事務中,則原有事務掛起,新的事務被創建。
MANDATORY:該方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果在沒有事務的環境下被調用,容器拋出例外。
SUPPORTS:該方法在某個事務范圍內被調用,則方法成為該事務的一部分。如果方法在該事務范圍外被調用,該方法就在沒有事務的環境下執行。
NEVER:該方法絕對不能在事務范圍內執行。如果在就拋例外。只有該方法沒有關聯到任何事務,才正常執行。
NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務,則按REQUIRED屬性執行。它使用了一個單獨的事務,這個事務 擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。它只對DataSourceTransactionManager事務管理器起效。
到此為止基於XML的事務配置就算完成了。
使用 @Transactional
除了基於XML文件的聲明式事務配置外,你也可以采用基於注解式的事務配置方法。直接在Java源代碼中聲明事務語義的做法讓事務聲明和將受其影響的代碼距離更近了,而且一般來說不會有不恰當的耦合的風險,因為,使用事務性的代碼幾乎總是被部署在事務環境中。
下面的例子很好地演示了 @Transactional 注解的易用性,隨后解釋其中的細節。先看看其中的類定義
@Transactional public class DefaultFooService implements FooService { Foo getFoo(String fooName); Foo getFoo(String fooName, String barName); void insertFoo(Foo foo); void updateFoo(Foo foo); }
當我們使用注解式聲明事務時,在XML中只需要一句話就ok了
我們知道 @Transactional 注解可以聲明在類上,也可以聲明在方法上。在大多數情況下,方法上的事務會首先執行
例如: DefaultFooService 類在類的級別上被注解為只讀事務,但是,這個類中的 updateFoo(Foo) 方法的 @Transactional 注解的事務設置將優先於類級別注解的事務設置。
@Transactional(readOnly = true) public class DefaultFooService implements FooService { public Foo getFoo(String fooName) { // do something } // these settings have precedence for this method @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void updateFoo(Foo foo) { // do something } }
@Transactional 有關的設置
@Transactional 注解是用來指定接口、類或方法必須擁有事務語義的元數據。 如:“當一個方法開始調用時就開啟一個新的只讀事務,並停止掉任何現存的事務”。 默認的 @Transactional 設置如下:
事務傳播設置是 PROPAGATION_REQUIRED
事務隔離級別是 ISOLATION_DEFAULT
事務是 讀/寫
事務超時默認是依賴於事務系統的,或者事務超時沒有被支持。
任何 RuntimeException 將觸發事務回滾,但是任何 checked Exception 將不觸發事務回滾
這些默認的設置當然也是可以被改變的。 @Transactional 注解的各種屬性設置總結如下:
屬性 |
類型 |
描述 |
枚舉型:Propagation |
可選的傳播性設置 |
|
isolation |
枚舉型:Isolation |
可選的隔離性級別(默認值:ISOLATION_DEFAULT) |
readOnly |
布爾型 |
讀寫型事務 vs. 只讀型事務 |
timeout |
int型(以秒為單位) |
事務超時 |
rollbackFor |
一組 Class 類的實例,必須是Throwable 的子類 |
一組異常類,遇到時 必須 進行回滾。默認情況下checked exceptions不進行回滾,僅unchecked exceptions(即RuntimeException的子類)才進行事務回滾。 |
rollbackForClassname |
一組 Class 類的名字,必須是Throwable的子類 |
一組異常類名,遇到時 必須 進行回滾 |
noRollbackFor |
一組 Class 類的實例,必須是Throwable 的子類 |
一組異常類,遇到時 必須不 回滾。 |
noRollbackForClassname |
一組 Class 類的名字,必須是Throwable 的子類 |
一組異常類,遇到時 必須不 回滾 |
在寫代碼的時候,不可能對事務的名字有個很清晰的認識,這里的名字是指會在事務監視器(比如WebLogic的事務管理器)或者日志輸出中顯示的名字, 對於聲明式的事務設置,事務名字總是全限定名+"."+事務通知的類的方法名。比如BusinessService類的handlePayment(..)方法啟動了一個事務,事務的名稱是:
com.foo.BusinessService.handlePayment
使用 @Transactional
除了基於XML文件的聲明式事務配置外,你也可以采用基於注解式的事務配置方法。直接在Java源代碼中聲明事務語義的做法讓事務聲明和將受其影響的代碼距離更近了,而且一般來說不會有不恰當的耦合的風險,因為,使用事務性的代碼幾乎總是被部署在事務環境中。
下面的例子很好地演示了 @Transactional 注解的易用性,隨后解釋其中的細節。先看看其中的類定義
@Transactional 有關的設置
@Transactional 注解是用來指定接口、類或方法必須擁有事務語義的元數據。 如:“當一個方法開始調用時就開啟一個新的只讀事務,並停止掉任何現存的事務”。 默認的 @Transactional 設置如下:
事務傳播設置是 PROPAGATION_REQUIRED
事務隔離級別是 ISOLATION_DEFAULT
事務是 讀/寫
事務超時默認是依賴於事務系統的,或者事務超時沒有被支持。
任何 RuntimeException 將觸發事務回滾,但是任何 checked Exception 將不觸發事務回滾
這些默認的設置當然也是可以被改變的。 @Transactional 注解的各種屬性設置總結如下:
@Transactional 注解的屬性
屬性 |
類型 |
描述 |
枚舉型:Propagation |
可選的傳播性設置 |
|
isolation |
枚舉型:Isolation |
可選的隔離性級別(默認值:ISOLATION_DEFAULT) |
readOnly |
布爾型 |
讀寫型事務 vs. 只讀型事務 |
timeout |
int型(以秒為單位) |
事務超時 |
rollbackFor |
一組 Class 類的實例,必須是Throwable 的子類 |
一組異常類,遇到時 必須 進行回滾。默認情況下checked exceptions不進行回滾,僅unchecked exceptions(即RuntimeException的子類)才進行事務回滾。 |
rollbackForClassname |
一組 Class 類的名字,必須是Throwable的子類 |
一組異常類名,遇到時 必須 進行回滾 |
noRollbackFor |
一組 Class 類的實例,必須是Throwable 的子類 |
一組異常類,遇到時 必須不 回滾。 |
noRollbackForClassname |
一組 Class 類的名字,必須是Throwable 的子類 |
一組異常類,遇到時 必須不 回滾 |
在寫代碼的時候,不可能對事務的名字有個很清晰的認識,這里的名字是指會在事務監視器(比如WebLogic的事務管理器)或者日志輸出中顯示的名字, 對於聲明式的事務設置,事務名字總是全限定名+"."+事務通知的類的方法名。比如BusinessService類的handlePayment(..)方法啟動了一個事務,事務的名稱是:
com.foo.BusinessService.handlePayment