1. 程式人生 > >事務管理及spring基於註解的宣告式事務管理的配置和用法

事務管理及spring基於註解的宣告式事務管理的配置和用法

因為前幾天看一個專案文件出現“本系統採用基於Spring的宣告式事務控制”,才根據文件和程式碼瞭解了一下事務管理的相關知識。這裡對自己的學習做個總結。

一:相關概念

1.事務:事務是一系列的動作,它們綜合在一起才是一個完整的工作單元,這些動作須全部完成,如果有一個失敗的話,那麼事務就會回滾到最開始的狀態,彷彿什麼都沒發生過一樣。用來確保資料的完整性和一致性。

2.事務的四個特性:原子性,一系列動作為一個整體,要麼都完成,要麼都不完成。一致性,事務完成後不管成功還是失敗,它所處理的業務涉及的資料要保持一致,不能一些改變了一些沒有改變。隔離性,就是說當一個事務沒有全部完成並提交之前,它所做的一切處理導致的結果比如資料的變化不會被其他事務看到。永續性:就是說一旦事務完成,它的結果就不受其他的影響例如系統崩潰之類的產生變化,通常事務的結果被儲存在持久化容器例如資料庫中。

3.事務管理的內容:

 

注:spring中事務管理的結構。

1)定義事務的基本屬性:事務超時(事務最長持續時間,當事務超出設定的最長持續時間還未完成的話會自動進行回滾。)、是否只讀(設定為只讀的事務不會修改任何資料)、傳播行為(當事務被另一個事務呼叫時是在現有事務中執行還是新開一個事務執行)、隔離規則(設定未提交的事務所修改的資料是否會被其他事務看到)、回滾規則(定義哪些異常會導致事務回滾哪些則不用回滾)。spring中定義事務的介面為TransactionDefinition,此外,它也能獲得事務屬性狀態等。

2)事務管理器會一直監控事務的狀態,並對不同的事務狀態做出處理,狀態有是否是新事務、是否有恢復點、設定為只回滾,是否為只回滾,是否已完成等。Spring監控事務狀態的介面是TransactionStatus,呼叫這個介面的方法是getTransaction()

3)事務管理器監控到事務的狀態之後就會對事務做出相應處理,事務管理器能夠做的處理有:事務回滾(rollback())、事務提交(commit())、事務狀態獲得(getTransaction())。

注:注:Spring並不直接管理事務,它是根據專案所使用的持久化框架把事務委託給相關框架的事務管理器來實現,所以事務管理器會對事務做出什麼樣的處理是和所使用的持久化框架和監控到的事務的引數來決定的。

Spring管理事務的介面是PlatformTransactionManager。這個介面為JDBC、hibernate、JPA、JTA等提供了對應的事務管理器。

4)JPA:JPA通過JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。

5)JTA:JTA允許應用程式執行分散式事務處理——在兩個或多個網路計算機資源上訪問並且更新資料。(J2EE平臺使用)。

(疑惑:spring的事務管理機制是把事務管理委託給持久化框架的事務管理器去做,還是給不同的框架提供不同的它自己的管理器去管理?我自己的理解:就是說 它只是對其他框架的事務管理進行配置,使之有統一的程式設計或者說使用模型,但是實際的事務管理還是由框架來完成的。需要看一下配置的事務是spring提供的類還是其它的框架提供的。但是像mybatis這類的框架並沒有包含在spring提供的事務管理器裡面啊,這種又怎麼辦呢?我看的專案用的JPA事務管理,但是持久化框架是mybatis,這樣又是怎麼回事呢?)

二:宣告式事務管理步驟(全註解方式)

1.在spring的配置檔案中引入<tx:>名稱空間。

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
	http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
	default-lazy-init="false">

2.在配置檔案中定義事務管理器,不同的持久化框架的事務管理器不同。其中entityManagerFactory是spring的實體管理器工廠。

<!-- 定義事務管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	 <property name="dataSource" ref="dataSource" />
			<!-- <property name="dataSource" ref="jndiDataSource" /> -->
		<property name="persistenceUnitName" value="app_db_unit" />
		<property name="persistenceXmlLocation" value="classpath:persistence-app.xml" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="databasePlatform" value="${hibernate.dialect}" />
			</bean>
		</property>
	</bean>

3.開啟spring提供的基於註解的宣告式事務管理,使具有@Transactional 註解的bean自動配置為宣告式事務支援。

<tx:annotation-driven transaction-manager="transactionManager"	proxy-target-class="true" />

4.然後在dao層需要的類或介面前邊加上註解(我想應該是有關資料庫操作的類才行吧),這樣就算好了。

 

注:被transactional註解的類只能被public修飾。

5.設定事務屬性。類似下圖。

 

三:參考文章。