Spring 聲明式事務

1.事務的管理方式可以分爲兩種:

a)編程式事務管理: 通過代碼編寫的形式進行事務管理的方式
b)聲明式事務管理: 通過配置的形式進行事務管理的方式

Spring中的聲明式事務是藉助AOP實現的. 聲明事務還提供了對事務更細緻的控制.

2.完成聲明式事務的配置

必須依賴spring-tx.jar包和tx及aop命名空間

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--此處用於配置聲明式事務-->
    <!--配置事務管理器: 在spring-jdbc.jar提供了事務管理器, DataSourceTransactionManager-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--配置事務通知-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <!--對切點方法進行更細緻的管理, 查詢方法不進行事務控制, 其他方法要進行事務控制-->
            <!--增刪改操作時, 沒有異常就會提交, 有異常就會回滾-->
            <!--允許使用通配符來描述此處的方法名, 通過方法名稱來區別是查詢操作還是增刪改操作-->
            <tx:method name="sel*" read-only="true" />
            <tx:method name="query*" read-only="true" />
            <tx:method name="find*" read-only="true" />
            <tx:method name="*List" read-only="true" />
            <tx:method name="*" />
         </tx:attributes>
    </tx:advice>
    <!--配置AOP-->
    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.bjsxt.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />
    </aop:config>
</beans>
3.聲明式事務中常見的屬性介紹
3.1name屬性

通過通配符定義方法名稱, 用於區分查詢操作和增刪改操作

3.2read-only屬性

布爾值, 默認爲false, 表示增刪改操作, spring會進行事務管理; 如果設置爲true, 表示只讀操作(查詢), spring不對其進行事務管理, 能夠提升查詢的效率.

3.3rollback-for屬性

用於指定發生什麼異常時要進行事務的回滾. 默認不需要配置, spring會在發生運行時異常時進行事務的回滾.

3.4no-rollback-for屬性

用於指定當發生什麼異常時不進行事務的回滾. 基本不會配置.

3.5isolation屬性

用於指定事務的隔離級別. 取值有:

  • DEFAULT, 表示採用數據庫默認的隔離級別
  • READ_UNCOMMITTED, 表示可以讀取到未提交的數據. 可能發生髒讀, 不可重複讀和幻讀. 安全性最低, 效率最高.
  • READ_COMMITTED, 表示只能讀取到已經提交的數據, 可以防止髒讀, 無法防止不可重複讀和幻讀.
  • REPEATABLE_READ, 表示可以重複讀取. 可以防止髒讀和不可重複讀. 可能發生幻讀. 實現方式是給行加鎖.
  • SERIALIZABLE, 表示序列化(排隊). 級別最高, 防止發生髒讀, 不可重複讀和幻讀. 給整張表加鎖. 安全性最高, 效率最差.
    需要先明白幾個專業詞彙:
    髒讀: 讀取髒數據(未提交的數據)的過程
    不可重複讀: 在同一次事務中, 兩次讀取的數據不一致.
    幻讀: 針對整張表格查詢, 同一次事務中, 兩次查詢整張表格結果不一致
3.6propagation屬性

事務的傳播行爲. 常用的屬性:

  • REQUIRED, 默認值. 必須在事務環境下執行, 如果當前有事務, 則使用當前事務執行; 如果當前沒有事務, 創建事務執行.
  • REQUIRES_NEW. 必須在事務環境下執行, 如果當前沒有事務, 創建事務執行; 如果當前有事務, 將當前事務掛起, 創建新事務執行, 結束後原來的事務繼續執行.
  • SUPPORTS. 支持事務環境. 如果當前有事務, 使用當前事務環境執行; 如果當前沒有事務, 可以在非事務環境執行.
  • NOT_SUPPORTED. 不支持事務. 如果當前沒有事務, 則正常執行; 如果當前有事務, 將事務掛起, 在非事務環境下執行, 之後原來的事務繼續執行.
  • MANDATORY. 必須在事務環境執行. 如果當前有事務, 則在當前事務環境執行; 如果當前沒有事務, 直接拋出異常.
  • NEVER. 必須沒有事務. 如果當前沒有事務, 正常執行; 如果當前有事務, 直接拋出異常.
  • NESTED. 嵌套的. 如果當前沒有事務, 創建事務執行; 如果當前已有事務, 再創建一個嵌套的事務繼續執行(不會掛起原有的事務).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章