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版權聲明:本文為部落客原創文章,轉載請附上博文連結!