編程式事務(少用):
a) 需要事務處理的dao類需繼承NamedParameterJdbcDaoSupport這個類;
b) 在applicationContext.xml文件中配置這個dao的Bean以及數據源Bean;
c) 往dao中注入數據源;
d) 配置事務管理器,並往事務管理器中注入數據源;
e) 往dao中注入事務管理器。
a) 需要事務處理的dao類需繼承NamedParameterJdbcDaoSupport這個類;
b) 在applicationContext.xml文件中配置這個dao的Bean以及數據源Bean;
c) 往dao中注入數據源;
d) 配置事務管理器,並往事務管理器中注入數據源;
e) 配置事務模板,並往事務模板中注入事務管理器;
f) 往dao中注入事務模板。
總結:dao(繼承NamedParameterJdbcDaoSupport,並注入數據源)-->事務模板-->事務管理器(數據源)-->數據源
申明式事務:
1)使用代理工廠:
步驟1:聲明委託對象,如:
步驟2:定義事務管理器,如:
步驟3:創建事務代理父工廠
注意:1. abstract=“true“ 說明該工廠爲抽象工廠,無法進行對象處理,只能被繼承
2. transactionAttributes表示設置事務的傳播屬性
步驟4:創建事務子工廠
步驟5:調用:往需要userDao對象的調用者注入userDao
注意:注入的是代理了userdao對象的事務子工廠,並且使用接口聲明。
如:IUserDao userDaoProxy;
//省略get,set方法
2)使用命名空間(一般使用這個):
步驟1:引入命名空間
步驟2:定義事務通知者advice
步驟3:再通過aop織入
這就是定義了一個PointCut,該Pointcut表示“在com.softfz.jdbcTemplate包下所有的方法” 。
expression="execution(* com.cj.transaction.service.*.*(..))" 中幾個通配符的含義:
第一個 * —— 通配 任意返回值類型
第二個 * —— 通配 包com.cj.transaction.service下的任意class
第三個 * —— 通配 包com.cj.transaction.service下的任意class的任意方法
第四個 .. —— 通配 方法可以有0個或多個參數
注意:第一個*後面有一個空格
申明式事務中異常處理:
Spring中,將爲委託對象的每個方法創建事務,Spring的事務支持默認對運行期異常(RuntimeException)進行回滾 ,而RuntimeException無需開發者顯式聲明。
如果手動捕獲異常,則spring容器認爲開發者試圖進行手動事務回滾,將無法用spring容器來進行事務回滾。
但是如果是發生非RuntimeException及其子類的異常,則spring容器無法進行事務處理 ,如果需要管理,需要進行相關配置,代碼如下:
<!-- +提交,-回滾,後面爲異常類型,表示該方法如果拋出這個異常則進行相應的事務處理 -->
<props>
<prop key="*">PROPAGATION_REQUIRED,-FileNotFoundException</prop>
<prop key="list">readOnly</prop>
</props>