天天看點

Spring AOP實作事務管理

Spring AOP實作事務管理

事務管理對于企業應用來說是至關重要的,即使出現異常情況,它也可以保證資料的一緻性。Sping中的事務管理,其實就是對資料庫的事務進行管理(送出、復原)。

在Spring架構中最常用的就是聲明式配置事務,而聲明式配置可以基于xml進行配置,也可以基于注解進行配置。

一、 基于注解的配置,顧名思義,既然基于注解來配置,就必不可少注解,Spring架構中提供了

@Transactional注解,該注解主要是配置在需要開啟事務的service接口的實作類中,其中@Transactional值有以下屬性:

以上屬性主要針對isolation和propagation來講,這兩個屬性的值都是枚舉。

Isolation(事務隔離級别)該屬性的作用是表事務隔離開,對于一些多并發的通路或者更新同一個資料庫時,必須要設定該屬性,要不然會出現髒讀,更新丢失等問題。而isolation屬性就很有效的解決該問題,其中isolation屬性提供了不同隔離級别的枚舉值:

隔離級别 作用

Isolation.READ_UNCOMMITTED 讀取未送出資料(會出現髒讀, 不可重複讀)

Isolation.READ_COMMITTED 讀取已送出資料(會出現不可重複讀和幻讀)

Isolation.REPEATABLE_READ 可重複讀(會出現幻讀)

Isolation.SERIALIZABLE 串行化

Propagation(事務傳播行為)該屬性的作用是該如何建立事務,怎樣加入事務:

傳播行為 作用

Propagation.REQUIRED 如果有事務,那麼加入事務,沒有的話建立一個(不寫的情況下)

Propagation.NOT_SUPPORTED 容器不為這個方法開啟事務

Propagation.REQUIRES_NEW 不管是否存在事務,都建立一個新的事務,原來的挂起,新的執行完畢,繼續執行老的事務

Propagation.MANDATORY 必須在一個已有的事務中執行,否則抛出異常

Propagation.NEVER 必須在一個沒有的事務中執行,否則抛出異常(與Propagation.MANDATORY相反)

Propagation.SUPPORTS 如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務

那麼,在Spring中如何使用該事務注解呢?

在spring容器中配置如下配置資訊:

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 注解方式配置事物,為了配合自定義注解 -->
<tx:annotation-driven transaction-manager="transactionManager" /> 
           

在service的接口實作類中添加@Teansactional注解,注意:實作類或者實作方法通路權限為public

在@Transactional注解中設定isolation(事務隔離級别)和propagation(事務傳播行為)這兩個屬性,這兩個屬性根據業務需求來設定。其中rollbackFor該屬性的作用是:當程式報Exception該異常時,事務執行復原操作,保證資料的準确性。

如果某個方法不需要開啟事務,就在該方法上送出注解,propagation設定為Propagation.NOT_SUPPORTED

注意:

該注解必須放置spring(啟動容器)該容器中,要不然事務會啟動失敗(因為掃描器會掃描所有的bean(事務注解@Transactional))

二、 基于xml的配置:

<tx:advice id="txAdvice" transaction-manager="transactionManager" >
    <tx:attributes>
        <tx:method name="update*" rollback-for="CustomException" isolation="DEFAULT" propagation="REQUIRED" />
        <tx:method name="save*" rollback-for="CustomException" isolation="DEFAULT" propagation="REQUIRED" />
        <tx:method name="insert*" rollback-for="CustomException" isolation="DEFAULT" propagation="REQUIRED" />
        <tx:method name="add*" rollback-for="CustomException" isolation="DEFAULT" propagation="REQUIRED" />
        <tx:method name="delete*" rollback-for="CustomException" isolation="DEFAULT" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>
<!-- 編寫aop,讓spring自動對目标生成代理 -->
<aop:config>
    <!-- 切入點 -->
    <aop:pointcut expression="execution(* com.koi.service.impl.*.*(..))"
        id="myPointcut" />
    <!-- 配置通知器:将切入點與通知整合 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>           

作者:錦鯉(⑉°з°)--

來源:CSDN

原文:

https://blog.csdn.net/qq_40036240/article/details/94873661

版權聲明:本文為部落客原創文章,轉載請附上博文連結!