Spring配置文件中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。
DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,比如使用Hibernate進行數據訪問時,DataSource實際爲SessionFactory,TransactionManager的實現爲HibernateTransactionManager。
具體如下圖:
根據代理機制的不同,總結了五種Spring事務的配置方式,配置文件如下:
第一種方式:每個Bean都有一個代理
第二種方式:所有Bean共享一個代理基類
第三種方式:使用攔截器
第四種方式:使用tx標籤配置的攔截器
Spring使用 <tx:advice>和 <aop:config> 用來配置事務,具體如何配置你可以參考Spring文檔。
我解釋一下execution(*com.bluesky.spring.dao.*.*(..))中幾個通配符的含義:
第一個 * —— 通配 任意返回值類型
第二個 * —— 通配 包com.bluesky.spring.dao下的任意class
第三個 * —— 通配 包com.bluesky.spring.dao下的任意class的任意方法
第四個 .. —— 通配 方法可以有0個或多個參數
綜上:包com.bluesky.spring.dao下的任意class的具有任意返回值類型、任意數目參數和任意名稱的方法<tx:advice/> 有關的設置這一節裏將描述通過 <tx:advice/>
標籤來指定不同的事務性設置。默認的 <tx:advice/>
設置如下:
-
事務傳播設置是
REQUIRED
-
隔離級別是
DEFAULT
-
事務是 讀/寫
-
事務超時默認是依賴於事務系統的,或者事務超時沒有被支持。
-
任何
RuntimeException
將觸發事務回滾,但是任何 checkedException
將不觸發事務回滾
這些默認的設置當然也是可以被改變的。 <tx:advice/>
和 <tx:attributes/>
標籤裏的 <tx:method/>
各種屬性設置總結如下:
屬性 是否需要? 默認值 描述
name |
是 |
與事務屬性關聯的方法名。通配符(*)可以用來指定一批關聯到相同的事務屬性的方法。 如: |
|
propagation |
不 | REQUIRED | 事務傳播行爲 |
isolation |
不 | DEFAULT | 事務隔離級別 |
timeout |
不 | -1 | 事務超時的時間(以秒爲單位) |
read-only |
不 | false | 事務是否只讀? |
rollback-for |
不 |
將被觸發進行回滾的 |
|
no-rollback-for |
不 |
不 被觸發進行回滾的 |
第五種方式:全註解