Spring AOP事務管理(使用切面把事務管理起來)


在《Spring Transaction 分析事務屬性(事務的基本概念、配置)》基礎上 



1、使用基於注解的AOP事務管理 
<tx:annotation-driven transaction-manager="transactionManager"/>
 
<aop:aspectj-autoproxy /> 


探索tx:annotation-driven標簽: 
<tx:annotation-driven/>標簽是注解驅動的事務管理支持的核心。 

<tx:annotation-driven/>標簽的屬性: 
transaction-manager:指定到現有的PlatformTransactionManager bean的引用,通知會使用該引用。default="transactionManager" 
mode:指定Spring事務管理框架創建通知bean的方式。可用的值有proxy和aspectj。前者是默認值,表示通知對象是個JDK代理;后者表示Spring AOP會使用AspectJ創建代理。 
order:指定創建的切面的順序。只要目標對象有多個通知就可以使用該屬性。 
proxy-target-class:該屬性如果為true就表示你想要代理目標類而不是bean所實現的所有接口。default="false" 

探索@Transactional注解: 
你可以指定傳播、隔離級別、超時以及允許和不允許的異常。 
@Transactional注解的屬性: 
propagation:指定事務定義中使用的傳播 
isolation:設定事務的隔離級別 
timeout:指定事務的超市(秒) 
readOnly:指定事務的超時 
noRollbackFor:目標方法可拋出的異常所構成的數組,但通知仍會提交事務 
rollbackFor:異常所構成的數組,如果目標方法拋出了這些異常,通知就會回滾事務 



基於注解的事務管理小結: 
如果定義在類上,那么所有的方法都使用相同的方式,有些read就會抱怨給太多的東西了。 
如果在每個方法上都定義注解,那么就會很麻煩。 
(可以使用XML AOP事務管理能更好的處理這種情況) 







2、使用XML AOP事務管理 
<tx:advice/>標簽,該標簽會創建一個事務處理通知。

  1. <tx:advice id= transaction-manager=>  
  2.         <tx:method name= propagation= isolation= />  
  3.         <tx:method name= propagation= isolation= read-only=/>  
  4.         <aop:advisor pointcut= advice-ref= />  
  5.     <aop:pointcut id=  
  6. />  
  7.     <aop:advisor advice-ref=  
  8.                  pointcut-ref=/>  
  9. <tx:advice id= transaction-manager=>  
  10.   
  11.   
  12.   
  13. for"java.lang.RuntimeException" />  
  14.   
  15. />  
  16. </tx:advice>  









3、tx:advice標簽簡介 
id是該advice bean的標識,而transaction-manager則必須引用一個PlatformTransactionManager bean。 
還可以通過<tx:attributes>標簽定制<tx:advice>標簽所創建的通知的行為。 

<tx:method/>標簽的屬性:
 
name:方法名的匹配模式,通知根據該模式尋找匹配的方法。 
propagation:設定事務定義所用的傳播級別。 
isolation:設置事務的隔離級別。 
timeout:指定事務的超時(秒)。 
read-only:該屬性為true指示事務是只讀的 
no-rollback-for:以逗號分隔的異常類的列表,目標方法可以跑出這些異常而不會導致通知執行回滾 
rollback-for:以逗號分隔的異常類的列表,當目標方法跑出這些異常時會導致通知執行回滾。默認情況下,該列表為空,因此不在no-rollback-for列表中的任何運行時異常都會導致回滾。 



<tx:method>中isolation(隔離)和propagation(傳播)參數的含義: 
getIsolationLevel:他對其他事務所看到的數據變化進行控制。 
事務隔離級別: 
隔離級別 說明 
ISOLATION_DEFAULT 默認級別(對大多數數據庫來說就是ISOLATION_READ_COMMITTED) 
ISOLATION_READ_UNCOMMITTED 最低的隔離級別。事實上我們不應該隔離級別,因為在事務完成前,其他事務可以看到該事務所修改的數據。而在其他事務提交前,該事務也可以看到其他事務所做的修改。 
ISOLATION_READ_COMMITTED 大多數數據庫的默認級別。在事務完成前,其他事務無法看到該事務所修改的數據。遺憾的是,在該事務提交后,你就可以查看其他事務插入活更新的數據。這意味 着在事務的不同點上,如果其他事務修改數據,你會看到不同的數據。 
ISOLATION_REPEATABLE_READ 該隔離級別確保如果在事務中查詢了某個數據集,你至少還能再次查詢到相同的數據集,即使其他事務修改了所查詢的數據。然而如果其他事務插入了新數據,你就可以查詢到該新插入的數據。 
ISOLATION_SERIALIZABLE 代價最大、可靠性最高的隔離級別,所有的事務都是俺順序一個接一個的執行。 

getPropagationBehavior:指定了當代碼請求一個新的事務時Spring所做的事情。
傳播行為指: 
傳播行為 說明 
PROPAGATION_REQUIRED 當前如果有事務,Spring就會使用該事務;否則會開始一個新事務。 
PROPAGATION_SUPPORTS 當前如果有事務,Spring就會使用該事務;否則不會開啟一個新事務。 
PROPAGATION_MANDATORY 當前如果有事務,Spring就會使用該事務;否則會拋出異常。 
PROPAGATION_REQUIRES_NEW Spring總會開始一個新事務。如果當前有事務,則該事務掛起。 
PROPAGATION_NOT_SUPPORTED Spring不會執行事務中的代碼。代碼總是在非事務環境下執行,如果當期有事務,則該事務掛起。 
PROPAGATION_NEVER 即使當前有事務,Spring也會在飛事務環境下執行。如果當前有事務,則拋出異常。 
PROPAGATION_NESTED 如果當前有事務,則在嵌套事務中執行。如果沒有,那么執行情況與PROPAGATION_REQUIRED一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM