在《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/>標簽,該標簽會創建一個事務處理通知。
- <tx:advice id= transaction-manager=>
- <tx:method name= propagation= isolation= />
- <tx:method name= propagation= isolation= read-only=/>
- <aop:advisor pointcut= advice-ref= />
- <aop:pointcut id=
- />
- <aop:advisor advice-ref=
- pointcut-ref=/>
- <tx:advice id= transaction-manager=>
- for"java.lang.RuntimeException" />
- />
- </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一樣。