1. 程式人生 > >Spring事務管理淺析

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中面向切面動態代理的術語做了一個私下的自定義------“專案內方法雲劫持”

晚安