Spring配置聲明式事務
* 配置DataSource
* 配置事務管理器
* 事務的傳播特性
* 那些類那些方法使用事務
Spring配置文件中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。
DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,比如使用Hibernate進行數據訪問 時,DataSource實際爲SessionFactory,TransactionManager的實現爲 HibernateTransactionManager。
根據代理機制的不同,Spring事務的配置又有幾種不同的方式:
第一種方式:每個Bean都有一個代理
第二種方式:所有Bean共享一個代理基類
第三種方式:使用攔截器
第四種方式:使用tx標籤配置的攔截器
第五種方式:全註解
1、spring事務控制放在service層,在service方法中一個方法調用service中的另一個方法,默認開啓幾個事務?
spring的事務傳播方式默認是PROPAGATION_REQUIRED,判斷當前是否已開啓一個新事務,有則加入當前事務,否則新開一個事務(如果沒有就開啓一個新事務),所以答案是開啓了一個事務。
2、spring 什麼情況下進行事務回滾?
Spring、EJB的聲明式事務默認情況下都是在拋出unchecked exception後纔會觸發事務的回滾
unchecked異常,即運行時異常runntimeException 回滾事務;
checked異常,即Exception可try{}捕獲的不會回滾.當然也可配置spring參數讓其回滾.
spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring默認取決於是否拋出runtime異常).
如果拋出runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾。
一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉文件等)一定要拋出runtime exception,否則spring會將你的操作commit,這樣就會產生髒數據.所以你的catch代碼是畫蛇添足。