1. 程式人生 > >複習之spring基礎(三)——Spring 的事務管理—配置AOP事務(XML和註解方式)

複習之spring基礎(三)——Spring 的事務管理—配置AOP事務(XML和註解方式)

事務

事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗

事務的特性

  • 原子性 :強調事務的不可分割.
  • 一致性 :事務的執行的前後資料的完整性保持一致.
  • 隔離性 :一個事務執行的過程中,不應該受到其他事務的干擾.
  • 永續性 :事務一旦結束,資料就持久到資料庫.

解決讀問題:設定事務隔離級別

未提交讀 :髒讀,不可重複讀,虛讀都有可能發生 已提交讀 :避免髒讀。但是不可重複讀和虛讀有可能發生 可重複讀 :避免髒讀和不可重複讀.但是虛讀有可能發生. 序列化的 :避免以上所有讀問題.

Mysql 預設:可重複讀 Oracle 預設:已提交讀

事務的傳播行為

PROPAGION_XXX :事務的傳播行為 , 保證同一個事務中 PROPAGATION_REQUIRED 支援當前事務,如果不存在 就新建一個(預設) PROPAGATION_SUPPORTS 支援當前事務,如果不存在,就不使用事務 PROPAGATION_MANDATORY 支援當前事務,如果不存在,丟擲異常

保證沒有在同一個事務中 PROPAGATION_REQUIRES_NEW 如果有事務存在,掛起當前事務,建立一個新的事務 PROPAGATION_NOT_SUPPORTED 以非事務方式執行,如果有事務存在,掛起當前事務 PROPAGATION_NEVER 以非事務方式執行,如果有事務存在,丟擲異常 PROPAGATION_NESTED 如果當前事務存在,則巢狀事務執行

XML 方式配置AOP事務

配置事務的通知和aop 事務

    <!-- 配置事務的增強 -->    
     <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
     	<tx:attributes>
		      <!--  
		    isolation="DEFAULT"  隔離級別     
		    propagation="REQUIRED" 傳播行為     
		    read-only="false" 只讀
		    timeout="-1"  過期時間     
		    rollback-for=""  -Exception     
		    no-rollback-for="" +Exception    
		     --> 
		<tx:method name="save*" propagation="REQUIRED"  isolation="REPEATABLE_READ" read-only="false"  />
		<tx:method name="find*" propagation="REQUIRED"/>
		<tx:method name="update*" propagation="REQUIRED"/>
		<tx:method name="update*" propagation="REQUIRED"/>
 	</tx:attributes>    
</tx:advice> 

    <aop:config> 
     	<aop:pointcut expression="execution(* top.maniy.service..*ServiceImpl.*(..)" id="pointcut1"/> 
 		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>  
 	</aop:config> 

註解方式

配置事務管理器

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

開啟事務管理的註解

<!-- 開啟註解事務管理 -->  
<tx:annotation-driven transaction-manager="transactionManager"/> 

在使用事務的類上新增一個註解

@Transactional 
public class OrderDaoImpl implements OrderDao {