1. 程式人生 > >[Spring] Spring 探祕 之 事務配置(一)

[Spring] Spring 探祕 之 事務配置(一)

目錄

[Spring] Spring 探祕 之 事務配置(一)

[capsule-spring-boot-transaction] Spring 探祕 之 事務配置

準備工作

>>> [Spring Boot] Spring boot 整合mybatis、postgresql [Gradle構建專案]


資料庫事務簡介

何為資料庫事務?

是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。事務具有四個特性:原子性、一致性、隔離性、永續性。
  • 原子性:表示組成一個事務的多個數據庫操作是一個不可分割的原子單元。事務中的操作要麼都發生,要麼都不發生。
  • 一致性:事務前後資料的完整性必須保持一致
  • 隔離性:指多個使用者併發訪問資料庫時,一個使用者的事務不能被其他使用者的事務所幹擾,多個併發事務之間資料要相互隔離,
  • 永續性:指一個事務一旦被提交,它對資料庫的資料的改變是永久的,即使資料庫發生故障。

Spring宣告式事務管理

概述

1、Spring 的宣告式事務管理在底層是建立在 AOP 的基礎上。其本質是在方法前後進行攔截,然後在目標方法開始之前建立一個事務,在執行這目標方法結束後,根據執行情況提交或進行回滾事務。

2、宣告式事務最大的優點就是不需通過程式設計的方式而進行管理事務,這樣就不需要在業務邏輯程式碼中摻雜事務管理的程式碼,只需在配置檔案中做相關的事務規則宣告,便可將事務規則應用到業務邏輯中。

3、宣告式事務不足的地方在於,與程式設計式事務相比,只能作用到方法級別,無法像程式設計式事務那樣可以作用到程式碼塊級別

程式設計模板

Spring為事務管理提供了一致的程式設計模板,把事務處理的主要過程抽象出來,不管底層選擇的是mybatis、hibernate操作資料庫,都可以使用統一的事務程式設計模型。Spring通過AOP切面增強實現宣告式事務處理的功能。

  • 事務執行狀態:org.springframework.transaction.TransactionStatus
    在這裡插入圖片描述
  • 事務定義資訊(隔離級別、傳播等):org.springframework.transaction.TransactionDefinition
    在這裡插入圖片描述
  • 事務同步管理器:org.springframework.transaction.PlatformTransactionManager
    在這裡插入圖片描述

事務管理器的配置

Spring 將事務管理委託給底層具體的持久化實現框架來完成。因此,Spring為不同的持久化框架提供了PlatformTransactionManager 介面的實現類。

實現類 描述
org.springframework.transaction.jta.JtaTransactionManager 使用JPA進行持久化時,使用該事務管理器
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate X.0(X 可以為3/4/5)版本進行持久化時,使用該事務管理器
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC 或 Mybatis 等基於DataSource資料來源的持久化技術時,使用 該事務管理器
org.springframework.orm.jdo.JdoTransactionManager 使用JDO進行持久化時 ,使用該事務管理器
org.springframework.transaction.jta.JtaTransactionManager 具有多個數據源的全域性事務使用該事務管理器(不管採用何種持久化技術)

Spring將JDBC的Connection 、Hibernate的Session等訪問資料庫的連線或會話物件統稱為資源。這些資源在同一時刻是不能多執行緒共享的。為了讓DAOService類能租到singleton

Spring的事務同步管理類org.springframework.transaction.support.TransactionSynchronization使用ThreadLcoal為不同事務執行緒提供了獨立的資源副本,同時維護事務配置的屬性和執行狀態資訊。事務同步管理器是Spring事務管理的基石,不管使用者使用的是程式設計式事務管理,還是宣告式事務管理,都離不開同步管理器。

Spring框架為不同的持久化技術提供了一套從TransactionSynchronization中獲取對應執行緒繫結資源的工具類,如下:

持久化技術 執行緒繫結資源獲取工具
Spring JDBC 或 Mybatis org.springframework.jdbc.datasource.DataSourceUtils
Hibernate X .0 org.springframework.orm.hibernate3.SessionFactoryUtils
JPA org.springframework.orm.jpa.EntityManagerFactoryUtils
JDO org.springframework.orm.jdo.PersistenceManagerFactoryUtils

Spring配置事務管理器和策略

xml形式

<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 事務策略
1、<tx:advice>定義事務通知,用於指定事務屬性,其中“transaction-manager”屬性指定事務管理器,並通過<tx:attributes>指定具體需要攔截的方法
2、<tx:method>攔截方法,其中引數有:
    name:方法名稱,將匹配的方法注入事務管理,可用萬用字元(*)可以用來指定一批關聯到相同的事務屬性的方法。 如:'find*'、'handle*'、'on*Event'等等。
    propagation:事務傳播行為,
    isolation:事務隔離級別定義;預設為“DEFAULT”
    timeout:事務超時時間設定,單位為秒,預設-1,表示事務超時將依賴於底層事務系統;
    read-only:事務只讀設定,預設為false,表示不是隻讀;
    rollback-for:需要觸發回滾的異常定義,可定義多個,以“,”分割,預設任何RuntimeException都將導致事務回滾,而任何Checked Exception將不導致事務回滾;
    no-rollback-for:不被觸發進行回滾的 Exception(s);可定義多個,以“,”分割;
-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="add*" propagation="REQUIRED" read-only="false"
                      rollback-for="java.lang.Exception"/>
           <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                      rollback-for="java.lang.Exception"/>
           <tx:method name="del*" propagation="REQUIRED" read-only="false"
                      rollback-for="java.lang.Exception" />
           <tx:method name="modify*" propagation="REQUIRED" read-only="false"
                      rollback-for="java.lang.Exception" />
           <tx:method name="handle*" propagation="NOT_SUPPORTED" read-only="false" />
           <tx:method name="*" propagation="SUPPORTS" read-only="true" />
       </tx:attributes>
   </tx:advice>

說明:

  • 異常的繼承結構Throwable為基類,ErrorException繼承ThrowableErrorRuntimeException及其子類稱為未檢查異常(unchecked),其它異常成為已檢查異常(checked)。
  • 事務配置:告知資料庫驅動程式和資料庫系統,這個事務並不包含更改資料的操作,那麼JDBC驅動程式和資料庫就有可能根據這種情況對該事務進行一些特定的優化,比方說不安排相應的資料庫鎖,以減輕事務對資料庫的壓力,畢竟事務也是要消耗資料庫的資源的。

Spring 事務傳播規則

[Spring] Spring 探祕 之 事務配置(二) 請前往

>>> [Spring] Spring 探祕 之 事務配置(二)

REFRENCES