1:基本原理
Spring事務(wù)的本質(zhì)其實就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持涯曲,spring是無法提供事務(wù)功能的。對于純JDBC操作數(shù)據(jù)庫在塔,想要用到事務(wù)幻件,可以按照以下步驟進行:
1:獲取連接 Connection con = DriverManager.getConnection() 2:開啟事務(wù)con.setAutoCommit(true/false); 3:執(zhí)行CRUD 4:提交事務(wù)/回滾事務(wù) con.commit() / con.rollback(); 5:關(guān)閉連接 conn.close();
使用Spring的事務(wù)管理功能后,我們可以不再寫步驟 2 和 4 的代碼蛔溃,而是由Spirng 自動完成绰沥。那么Spring是如何在我們書寫的 CRUD 之前和之后開啟事務(wù)和關(guān)閉事務(wù)的呢篱蝇?解決這個問題,也就可以從整體上理解Spring的事務(wù)管理實現(xiàn)原理了揪利。下面簡單地介紹下态兴,注解方式為例子
1:配置文件開啟注解驅(qū)動,在相關(guān)的類和方法上通過注解@Transactional標(biāo)識疟位。 2:spring 在啟動的時候會去解析生成相關(guān)的bean瞻润,這時候會查看擁有相關(guān)注解的類和方法,并且為這些類和方法生成代理甜刻,并根據(jù)@Transaction的相關(guān)參數(shù)進行相關(guān)配置注入绍撞,這樣就在代理中為我們把相關(guān)的事務(wù)處理掉了(開啟正常提交事務(wù),異车迷海回滾事務(wù))士修。 3:真正的數(shù)據(jù)庫層的事務(wù)提交和回滾是通過binlog或者redo log實現(xiàn)的阴汇。
2: @Transactional注解使用警戒線
不允許在private方法上加@Transactional注解啤握,因為即時在private方法上加上該注解Spring事務(wù)也不起作用未状。
如果要使用aspectj方式來進行事務(wù)控制,pom文件中需要引入spring-aspects 蜕径。
當(dāng)在同一個類中两踏,一個沒注解的方法調(diào)用一個有@Transactional方法時,事務(wù)不生效 兜喻。不管運行期異常是在哪個方法中拋出梦染,事務(wù)均不生效(親測,但僅當(dāng)使用JDKProxy代理)朴皆,但是當(dāng)使用AspectJ時帕识,不影響,AspectJ配置如下:
<!-- Spring生成代理有2種方式遂铡,默認(rèn)使用JDKProxy -->
<tx:annotation-driven transaction-manager="txManager" />
<!--代理模式 基于CGLIB-->
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
<!--如果要使用aspectj方式來進行事務(wù)控制肮疗,pom文件中需要引入spring-aspects-->
<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>
3. 擴展閱讀
http://blog.csdn.net/tzdwsy/article/details/50491459
Spring動態(tài)代理的坑
Transaction 那些事兒
spring事務(wù)管理的一些注意點
4. 使用SpringJunit4Test進行測試時,@Rollback生效問題:
如果需要@Rollback注解生效扒接,則需要在測試類上加上@Transactional注解伪货,否則@Rollback不起作用。
如果沒有整合SpringJunit4Test珠增,則@Rollback可正常生效,默認(rèn)true砍艾。
擴展閱讀:示例代碼