Spring基於註解配置事務的屬性

本文實例為大傢分享瞭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)
    {
        ...
    }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: