spring中的事務管理(四)
超時和只讀屬性
由於事務可以在行和表上獲得鎖, 因此長事務會佔用資源, 並對整體性能產生影響.
如果一個事務只讀取數據但不做修改, 數據庫引擎可以對這個事務進行優化.
超時事務屬性: 事務在強制回滾之前可以保持多久. 這樣可以防止長期運行的事務佔用資源.
只讀事務屬性: 表示這個事務只讀取數據但不更新數據, 這樣可以幫助數據庫引擎優化事務.
超時和只讀屬性可以在@Transactional 註解中定義.超時屬性以秒爲單位來計算.
在事務通知中, 超時和只讀屬性可以在 <tx:method> 元素中進行指定.
事務中的屬性設置(@Transactional)
propagation屬性:用來設置事務的傳播行爲 -Propagation.REQUIRED:默認,使用調用者的事務 -Propagation.REQUIRES_NEW:開啓一個新事務
isolation屬性:用來設置事務的隔離級別 -Isolation.REPEATABLE_READ:可重複讀,Mysql默認的隔離級別 -Isolation.READ_COMMITTED:讀已提交,Oracle默認的隔離級別,也是常有的隔離級別
rollbackFor屬性:用來設置出現什麼異常時纔回滾,值是一個數組,裏面放的是異常的類型 rollbackForClassName屬性:用來設置出現什麼異常時纔回滾,值是一個數組,裏面放的是異常的名字 noRollbackFor屬性:用來設置出現什麼異常不回滾,值是一個數組,裏面放的是異常的類型 norollbackForClassName屬性:用來設置出現什麼異常時不回滾,值是一個數組,裏面放的是異常的名字
timeout屬性:用來設置超時的時間,單位是秒
readOnly屬性:用來設置當前操作是一個只讀的操作,通常對數據庫進行查詢操作時設置該屬性爲true
@Transactional(propagation=Propagation.REQUIRES_NEW , isolation=Isolation.READ_COMMITTED, noRollbackFor={ArithmeticException.class},timeout=3,readOnly=false)
|
切入點表達式
1、切入點表達式的格式:execution([可見性] 返回類型 [聲明類型].方法名(參數) [異常])
2、切入點表達式通配符: *:匹配所有字符 ..:一般用於匹配多個包,多個參數 +:表示類及其子類
3、切入點表達式支持邏輯運算符:&&、||、!
4、切入點表達式關鍵詞: 1)execution:用於匹配子表達式。 //匹配com.cjm.model包及其子包中所有類中的所有方法,返回類型任意,方法參數任意 @Pointcut("execution(* com.cjm.model..*.*(..))") public void before(){}
2)within:用於匹配連接點所在的Java類或者包。 //匹配Person類中的所有方法 @Pointcut("within(com.cjm.model.Person)") public void before(){}
//匹配com.cjm包及其子包中所有類中的所有方法 @Pointcut("within(com.cjm..*)") public void before(){}
3) this:用於向通知方法中傳入代理對象的引用。 @Before("before() && this(proxy)") public void beforeAdvide(JoinPoint point, Object proxy){ //處理邏輯 }
4)target:用於向通知方法中傳入目標對象的引用。 @Before("before() && target(target) public void beforeAdvide(JoinPoint point, Object proxy){ //處理邏輯 }
5)args:用於將參數傳入到通知方法中。 @Before("before() && args(age,username)") public void beforeAdvide(JoinPoint point, int age, String username){ //處理邏輯 }
6)@within :用於匹配在類一級使用了參數確定的註解的類,其所有方法都將被匹配。 @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation標註的類都將匹配 public void before(){}
|