spring中的事務管理(四)

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(){}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章