首頁 > 軟體

Spring基於註解設定事務的屬性

2022-08-26 14:01:15

本文範例為大家分享了Spring基於註解設定事務的屬性,供大家參考,具體內容如下

一、事務屬性概述

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

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

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

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

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。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com