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>``` 複製程式碼
- 基於註解方式配置事務
- spring的配置檔案中需要開啟註解
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 開啟註解事務 --> <tx:annotation-driven transaction-manager="transactionManager"/>``` 2. 在需要事務的類上新增註解如圖: 複製程式碼