接下來我將給你們介紹spring事務配置的兩種方式:html
1.基於XML的事務配置。2.基於註解方式的事務配置。java
<tx:advice/> 有關的設置spring
經過 <tx:advice/> 標籤來指定不一樣的事務性設置。默認的 <tx:advice/> 設置以下:express
事務傳播設置是 REQUIREDapache
隔離級別是DEFAULToracle
事務是 讀/寫ide
事務超時默認是依賴於事務系統的,或者事務超時沒有被支持。this
任何 RuntimeException 將觸發事務回滾,可是任何 checked Exception 將不觸發事務回滾url
這些默認的設置固然也是能夠被改變的。 <tx:advice/> 和 <tx:attributes/> 標籤裏的 <tx:method/> 各類屬性設置總結以下:spa
屬性 |
是否須要? |
默認值 |
描述 |
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的事務配置就算完成了。
除了基於XML文件的聲明式事務配置外,你也能夠採用基於註解式的事務配置方法。直接在Java源代碼中聲明事務語義的作法讓事務聲明和將受其影響的代碼距離更近了,並且通常來講不會有不恰當的耦合的風險,由於,使用事務性的代碼幾乎老是被部署在事務環境中。
下面的例子很好地演示了 @Transactional 註解的易用性,隨後解釋其中的細節。先看看其中的類定義
當咱們使用註解式聲明事務時,在XML中只須要一句話就ok了
咱們知道 @Transactional 註解能夠聲明在類上,也能夠聲明在方法上。在大多數狀況下,方法上的事務會首先執行
例如: DefaultFooService 類在類的級別上被註解爲只讀事務,可是,這個類中的 updateFoo(Foo) 方法的 @Transactional 註解的事務設置將優先於類級別註解的事務設置。
@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 註解的各類屬性設置總結以下:
屬性 |
類型 |
描述 |
枚舉型: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
接下來我將給你們介紹spring事務配置的兩種方式:
1.基於XML的事務配置。2.基於註解方式的事務配置。
<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的事務配置就算完成了。
除了基於XML文件的聲明式事務配置外,你也能夠採用基於註解式的事務配置方法。直接在Java源代碼中聲明事務語義的作法讓事務聲明和將受其影響的代碼距離更近了,並且通常來講不會有不恰當的耦合的風險,由於,使用事務性的代碼幾乎老是被部署在事務環境中。
下面的例子很好地演示了 @Transactional 註解的易用性,隨後解釋其中的細節。先看看其中的類定義
當咱們使用註解式聲明事務時,在XML中只須要一句話就ok了
咱們知道 @Transactional 註解能夠聲明在類上,也能夠聲明在方法上。在大多數狀況下,方法上的事務會首先執行
例如: DefaultFooService 類在類的級別上被註解爲只讀事務,可是,這個類中的 updateFoo(Foo) 方法的 @Transactional 註解的事務設置將優先於類級別註解的事務設置。
@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 註解的各類屬性設置總結以下:
屬性 |
類型 |
描述 |
枚舉型: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