Spring 事務管理

木頭房子de發表於2018-11-27

Spring事務

什麼是事務

  • 邏輯上的一組操作,這組操作要麼全部成功,要麼全部失敗。
  • 事務的特性:
    • 原子性
      • 事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生
    • 一致性
      • 執行事務前後資料的完整性必須保持一致
    • 隔離性
      • 多個使用者併發訪問資料庫時,一個使用者的事務不能被其他使用者的事務所干擾,多個併發事務之間資料相互隔離
    • 永續性
      • 事務一旦提交完成,資料修改是永久的,即使資料庫發生故障也不會對其有任何影響

Spring事務管理

Spring事務管理主要3個介面

  • 事務管理器-PlatformTransactionManager
    • getTransaction(TransactionDefinition):TransactionStatus
    • commit(TransactionStatus):void
    • rollback(TransactionStatus):void
  • 事務定義資訊-TransactionDefinition
    • 定義事務的隔離級別、傳播行為、是否超時、是否只讀等
    • TransactionDefinition介面中的定義的常量以及方法 如圖:
      Spring 事務管理
  • 事務具體執行狀態-TransactionStatus
    • isNewTransaction():boolean
    • hasSavepoint():boolean
    • setRollbackOnly():void
    • isRollbackOnly():boolean
    • flush():void
    • isCompleted():boolean

事務隔離級別

  • 髒讀
    • 一個事務讀取了另一個事務改寫但還未提交的資料,如果這些資料被回滾,則讀到的資料是無效的據被回滾,則讀到的資料是無效的
  • 不可重複讀
    • 在同一事務中,多次讀取同一資料返回的結果不同
  • 幻讀
    • 一個事務讀取了幾行記錄後,另一個事務插入記錄,再進行讀取時,第一個事務發現多了之前沒有的記錄
  • 事務隔離級別如圖:
    Spring 事務管理

事務的傳播行為

  • Spring中提供的七種事務傳播行為 如圖:
    Spring 事務管理
  • 解決業務層方法之間相互呼叫中多個事務之間的順序問題
  • TransactionDefinition.PROPAGATION_REQUIRED
    • 支援當前事務,如果不存在就新建一個
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW
    • 如果有事務,掛起當前事務,建立一個新事務
  • TransactionDefinition.PROPAGATION_NESTED -如果當前事務存在,則巢狀事務執行

Spring宣告式事務

  • 使用XML配置基於AspectJ tx/aop
    • 如圖配置資訊:
      Spring 事務管理
    • spring.xml配置程式碼
    		<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    			<property name="dataSource" ref="dataSource"/>
    		</bean>
    		<!-- 配置事務通知 -->
    		<tx:advice id="txAdvice" transaction-manager="transactionManager">
    			<tx:attributes>
    				<tx:method name="search*" read-only="true"/>
    				<tx:method name="get*" read-only="true"/>
    				<tx:method name="create*" read-only="false"/>
    				<tx:method name="update*" read-only="false"/>
    				<tx:method name="delete*" read-only="false"/>
    				<tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
    			</tx:attributes>
    		</tx:advice>
    		<!-- 配置切面 -->
    		<aop:config>
    			<!-- 配置切入點 -->
    			<aop:pointcut id="txPointcut" expression="execution(* com.brh.p2p.admin.service.*.*(..))" />
    			<!-- 配置切面 -->
    			<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
    		</aop:config>```
    複製程式碼
  • 基於註解方式配置事務
    1. spring的配置檔案中需要開啟註解
    	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="dataSource"/>
    	</bean>
    	<!-- 開啟註解事務 -->
    	<tx:annotation-driven transaction-manager="transactionManager"/>```
    2. 在需要事務的類上新增註解如圖:
    複製程式碼

Spring 事務管理
Spring 事務管理

相關文章