Spring 事務管理

Spring事務

什麼是事務

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

Spring事務管理

Spring事務管理主要3個接口

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

事務隔離級別

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

事務的傳播行爲

  • Spring中提供的七種事務傳播行爲 如圖:
  • 解決業務層方法之間相互調用中多個事務之間的順序問題
  • TransactionDefinition.PROPAGATION_REQUIRED
    • 支持當前事務,若是不存在就新建一個
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW
    • 若是有事務,掛起當前事務,建立一個新事務
  • TransactionDefinition.PROPAGATION_NESTED -若是當前事務存在,則嵌套事務執行

Spring聲明式事務

  • 使用XML配置基於AspectJ tx/aop
    • 如圖配置信息:
    • 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. 在須要事務的類上添加註解如圖:
    複製代碼

相關文章
相關標籤/搜索