中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring基于注解怎么配置事務的屬性

發布時間:2022-08-26 14:03:23 來源:億速云 閱讀:125 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring基于注解怎么配置事務的屬性”,在日常操作中,相信很多人在Spring基于注解怎么配置事務的屬性問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring基于注解怎么配置事務的屬性”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、事務屬性概述

在Spring中,事務屬性描述了事務策略如何應用到方法上,事務屬性包含5個方面:

① 傳播行為
② 隔離級別
③ 回滾策略
④ 超時時間
⑤ 是否只讀

二、事務的傳播行為屬性##

1、當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。例如,方法可能繼續在現有的事務中允許,也可能開啟一個新事務,并在自己的事務中運行。
2、事務的傳播行為可以由傳播屬性指定,Spring定義了7種類型的傳播行為。其中最常用的是REQUIREDREQUIRES_NEW

Spring基于注解怎么配置事務的屬性

3、事務的傳播屬性可以在@Transactional注解的propagation屬性中定義。

4、舉個例子:

/**
 * 使用 @Transactional 指定事務方法
 */
@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService
{
    /**
     * 1. 添加事務注解@Transactional。
     * 2. 使用 propagation 指定事務的傳播行為,
     * 即當前事務方法被另外一個事務方法調用時,如何使用事務: 
     * 是使用調用方法的事務,還是開啟一個新事務(使用自己的事務)。
     * 3. propagation:
     *  ① 默認值是 Propagation.REQUIRED, 即使用調用方法的事務。
     *  ② 可以指定為 Propagation.REQUIRES_NEW, 即在調用方法的事務中開啟一個新事務(自己的事務)。
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void purchaseSigleBook(String acctName, String bookId)
    {
        ...
    }
}

三、事務的隔離級別##

1、從理論上來說,事務應該彼此完全隔離,以避免并發事務所導致的問題。然而,那樣會對性能產生極大的影響,因為事務必須按順序運行。
2、在實際開發中,為了提升性能,事務會以較低的隔離級別運行。
3、事務的隔離級別可以通過隔離級別事務屬性(isolation)指定。
4、Spring支持的事務隔離級別:

事務的隔離級別要得到底層數據庫引擎的支持,而不是應用程序或者框架的支持。
Oracle 支持的2種事務隔離級別:READ_COMMIT。
MySQL 支持4種事務隔離級別:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ 和 SERIALIZABLE。

Spring基于注解怎么配置事務的屬性

5、用@Transactional注解聲明式的管理事務時可以在 @Transactional 的isolation屬性中設置隔離級別。

6、舉個例子:

/**
 1. 使用 @Transactional 指定事務方法
 */
@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService
{
    /**
     * 1. 添加事務注解@Transactional。
     * 2. 使用isolation屬性指定事務的隔離級別,最常用的的取值是: Isolation.READ_COMMITTED。
     */
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void purchaseSigleBook(String acctName, String bookId)
    {
        ...
    }
}

四、事務的回滾屬性##

1、默認情況下只有未檢查異常( RuntimeException 和 Error 類型的異常)會導致事務回滾,而檢查異常不會。
2、事務回滾的規則可以通過 @Transactional注解的 rollbackFornoRollbackFor屬性來定義,這兩個屬性被聲明為Class[] 類型的,因此可以為這兩個屬性指定多個異常類。
① rollbackFor:指定遇到哪些異常時必須進行回滾。
② noRollbackFor:指定遇到哪些異常時,必須不回滾。

3、舉個例子:

/**
 * 使用 @Transactional 指定事務方法
 */
@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService
{
    /**
     * 1. 添加事務注解@Transactional。
     * 2. 使用rollbackFor 和 noRollbackFor指定事務遇到哪些異常時進行強制回滾或者強制不回滾。
     * 默認情況下,Spring聲明事務對所有運行時異常進行回滾.通常取默認值。
     */
    @Transactional(noRollbackFor = {UserAccounException.class})
    public void purchaseSigleBook(String acctName, String bookId)
    {
        ...
    }
}

五、事務的只讀屬性##

1、如果一個事務只讀取數據但不修改數據,數據庫引擎可以對這個事務進行優化。
2、只讀事務屬性:表示這個事務只讀取數據但不更新數,這樣可以幫助數據庫進行優化事務。
3、只讀屬性可以在@Transactional注解中readOnly屬性中定義,其取值只有true和false。
4、舉個例子:

/**
 * 使用 @Transactional 指定事務方法
 */
@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService
{
    /**
     * 1. 添加事務注解@Transactional。
     * 2. 使用 readOnly 只讀事務的只讀屬性,表示這個事務是否只讀取數據而不修改數據。
     */
    @Transactional(readOnly = true)
    public void purchaseSigleBook(String acctName, String bookId)
    {
        ...
    }
}

##六、事務的超時屬性##

1、由于事務可以在行和表上獲得鎖,因此長期運行的事務會占用資源,并對整體性能產生影響。
2、超時事務屬性:事務在強制回滾之前可以保持多久,這樣可以防止長期運行的事務占用資源。
3、超時屬性可以在 @Transactional注解中timeout屬性中定義,其單位為秒。
4、舉個例子:

/**
 * 使用 @Transactional 指定事務方法
 */
@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService
{
    /**
     * 1. 添加事務注解@Transactional。
     * 2. 使用 timeout 指定事務的超時屬性,表示在強制回滾之前,這個事務能運行多久,單位是秒。
     */
    @Transactional(timeout = 3)
    public void purchaseSigleBook(String acctName, String bookId)
    {
        ...
    }
}

到此,關于“Spring基于注解怎么配置事務的屬性”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石景山区| 马龙县| 乳山市| 固原市| 富锦市| 郁南县| 萍乡市| 安义县| 龙井市| 汾西县| 兴义市| 集贤县| 威远县| 博爱县| 买车| 津市市| 金秀| 卫辉市| 剑河县| 桐城市| 惠来县| 类乌齐县| 临武县| 泸水县| 渭南市| 嘉义县| 太谷县| 吉林省| 南昌市| 固镇县| 嘉定区| 岳西县| 彭水| 兴业县| 肃宁县| 尼勒克县| 红桥区| 松江区| 清河县| 大方县| 嘉兴市|