Spring事務管理淺析
今天學了Spring中的JdbcTemplate應用和Spring中的事務管理機制
由於JdbcTemplate比較簡單就不做贅述,在這裡在下就記述一下Spring中的事務管理機制和一些鄙見。
事務這個詞相信大家對其都並不陌生,有一定的資料庫基礎的朋友都應該聽說過事物具備的四大特性:
- 原子性 Atomicity
- 一致性 Consistency
- 隔離性 Isolation
- 永續性 Durability
簡稱(ACID),但在併發場景下,如果不對事物做任何隔離或者保護措施,就可能會造幻讀和不可重複讀的異常,擾亂業務邏輯,對此我們的MySQL和Oracl的資料庫都分別定製了一系列事務隔離機制來應對這些併發問題,當然安全的代價可能會帶來低的效率,在人類還沒想出更好的解決思路之前,我們先妥協一下前人給出的方案。
在JavaWeb開發中,我們可以用手動開啟提交或者關閉connection來做到對事物的控制,我們學到了強大的IOC容器Spring, Spring也對事物操作做了很好的支援, 我們新建一個maven專案來做示範
注意讀這篇文章的時候大家理應對Spring和JavaWeb開發有一定的小了解,如果之前從沒接觸過Spring的話,應該先去入門一下。
在開始之前我們先要匯入一些專案中要用到的包
spring-context spring-jdbc spring-tx mysql-connector-java spring-test junit
首先引入事務管理概念,在Spring中大方向上有兩種管理事務的模式,其一基於XML配置檔案,另一種是基於註解,兩者都各有特色,並不能蓋棺定論孰優孰劣,但核心思想都是一致的,我們以XML配置檔案為例,來對Spring事物先有一個縱覽。
在XML檔案中包掃描註解,引入properties檔案還有配置資料庫連結的Bean都不屬於這篇部落格的範疇,在下就不做贅述
就直接從配置事務管理器和配置事務來入手,比話少說,上程式碼,
<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="*" read-only="false" propagation="REQUIRED"/> <tx:method name="query*" read-only="true" propagation="SUPPORTS"/> </tx:attributes> </tx:advice>
前半段是配置Spring的事務管理器,傳入引數DataSource就好
後半段是為這個事務管理器宣告要管理的方法,並且注入事物的傳播行為,隔離級別,超時時間等屬性
那麼宣告好了事物以後我們怎麼在專案中應用這些宣告呢,高手過招總是無需多言,想必各位也早也想出了用Spring中自帶的AOP切入方法,比話少說,上程式碼,
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.itheima.spring.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
</aop:config>
<aop/>標籤第一句:切入點配置,定位橫切邏輯織入的方法 <aop/>標籤第二句:對於事務來說,不需要指定具體的方位資訊(方法前/後等)aop:advisor將增強邏輯和切入點關聯到一起(織入)
至此,我們就已經基本完成了事務控制的基本配置。
也就是說所有的方法都會開啟事務,並且以query開頭的方法是隻讀屬性。。。
好了,剩下的基於註解的開發方法師出同源,等待各位自己去開發,我先去睡覺了。
總結一下
Spring事物控制,它的作用是解決了開發者對於管理事物的難以下手問題,提供了統一的操作空間並對事物屬性進行高度的自定義。筆者給Spring中面向切面動態代理的術語做了一個私下的自定義------“專案內方法雲劫持”
晚安