spring_9
1:
異常類型: checked 異常(例外) 和 unchecked異常(例外)
checked 異常: 除運行期異常外的其他異常方法 聲明為throw Exception 的異常,則Spring默認不會回滾
unchecked 異常: 即運行期異常 RuntimeException Spring 默認會回滾
2:
改變Spring的默認事務行為:
(1):使Spring回滾checked例外(默認不會滾):
在方法的聲明上標注
@Transactional(rollbackFor=異常的名稱.class)
其中異常的名稱為方法拋出的異常(例外)的類名稱
則Spring在遇到此checked異常時,就會回滾事務
(2):使Spring不回滾unchecked 例外(默認回滾)
在方法的聲明上標注
@Transactional(noRollbackFor=RuntimeException.class)
則在方法遇到unchecked例外(運行期異常)時,則會提交事務
或者使用 noRollbackForClassName="異常的名稱" 和 rollbackForClassName="異常的名稱" 來指定
3:
以下的事務可以在 @Transactional(propagation=Propagation.xxx) 中的xxx即為以下事務的類型.
Spring事務的分類:
REQUIRED,NOT_SUPPORTED,REQUIRESNEW,MANDATORY,SUPPORTS,NERVER,NESTED
REQUIRED:
業務方法需要在一個事務中運行.如果方法運行時,已經處在一個事務中,那么假如到該事務,否則為自己創建一個新的事務.
NOT_SUPPORTED:
聲明方法不需要事務.如果方法沒有關聯到一個事務,容器不會為它開啟事務.如果方法在一個事務中被調用,該事務會被掛起,在方法調用結束后,原先的事務便會恢復執行.
REQUIRESNEW:
屬性表明不管是否存在事務,業務方法總會為自己發起一個新的事務,容器不會為它開啟事務.
如果方法已經存在一個事務中,則原有事務被掛起,新的事務會被創建,直到方法執行結束,新的事務才算結束.原先事務才會恢復執行.
MANDATORY:
該屬性指定業務方法只能在一個已近存在的事務中執行,業務方法不能發起自己的事務.如果業務方法沒有在事務的環境下調用,容器就會拋出例外.
SUPPORTS:
這一事務表明屬性,如果業務方法在某個事務范圍內被調用,則方法稱為該事務的一部分.如果業務方法在事務范圍外被調用,則方法在沒有事務的環境下執行.
NEVER:
指定業務方法絕對不能再事務范圍內執行.如果業務方法在某個事務中執行,容器會拋出異常,只有業務方法沒有關聯到任何事務,才能正常執行.
NESTED:
如果一個活動的事務存在,則運行一個嵌套的事務中.如果沒有活動事務,則按REQUIRED屬性執行.它使用了一個單獨的事務,這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。但外部事務的回滾會造成內部事務的回滾. 它只對DataSourceTransactionManager事務管理器起效.
4:
@Transactional(timeout=30)
中指定事務的超時時間,一般情況下不用設置
5:
@Transactional(readOnly="")
在只讀事務中使用,可以提高效率,但不可以執行增刪改.
6:
@Transactional(isolation=Isolation.DEFAULT);
指定數據庫的事務隔離級別:主要由底層數據庫實現.
包括種類:
Read Uncommited : 讀未提交數據(會出現臟數據,不可重復讀和幻讀)
Read Commited : 讀已提交數據(會出現不可重復讀和幻讀) (SQLServer 默認級別)
Repeatable Read : 可重復讀(會出現幻讀) (MySQL 默認級別)(一般情況下是這種級別)
Serializable : 串行化
這幾種級別是由數據庫的不同的鎖來實現:如 共享鎖,更新鎖,排他鎖
臟讀: 一個事務讀取到另一個事務未提交的更新數據.
不可重復讀: 在同一個事務中,多次讀取同一數據返回的結果有所不同.即:后續讀取可以讀取另一事物已提交的更新數據.
相反,"可重復讀"在同一事務多次讀取數據時,能夠保證所讀取數據一樣,也就是說,后續數據不能讀到另一事物已提交的更新數據.
可重復讀在數據庫采取的技術為"快造"技術
幻讀:一個事物讀取都另一事物已提交的insert數據.
7:
使用XML方式配置Spring事務:
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* cn.itcast.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/> <!-- 對讀取方法采用只讀 事務 -->
<tx:method name="*"/> <!-- 其他按照默認設置 如事務隔離級別 事務類型 -->
</tx:attributes>
</tx:advice>
posted on 2011-01-05 21:01 calmJava 閱讀(404) 評論(0) 編輯 收藏 所屬分類: Spring