Spring review--事務的傳播特性

ZeroWM發表於2016-08-11


  Spring的事務有兩種管理方式:程式設計式事務管理,宣告式事務管理。程式設計式就是在java程式碼中實現的事務,跟jdbc的事務類似。宣告式事務在xml中配置出來的,迎合了Spring侵入性小的特點。


  事務的傳播特性,常用的是第一個:

PROPAGATION_REQUIRED

如果存在一個事物,則支援當前事務。如果沒有事務則開啟。

PROPAGATION_SUPPORTS

如果存在一個事務,支援當前事務。如果沒有事務,則非事務的執行

PROPAGATION_MANDATORY

如果已經存在一個事務,則支援當前事務。如果沒有一個活動的事務,則丟擲異常

PROPAGATION_REQUIRES_NEW

總是開啟一個新的事務,如果一個事務已經存在,則將這個存在的事務 掛起。

PROPAGATION_Not_SUPPORTED

總是非事務的執行,並掛起任何存在的事務。

PROPAGATION_NEVER

總是非事務的執行,如果存在一個活動事務,則丟擲異常

 

PROPAGATION_NESTED

如果一個活動的事務存在,則執行在一個巢狀的事務中,如果沒有活動事務,則按required屬性執行。


下面是宣告式事務管理的配置檔案內容:

<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xmlns:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
           default-autowire="byName">
	<!-- 配置SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
	</bean>
	
	<!-- 配置事務管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="sessionFactory"></ref>
		</property>
	</bean>


	<aop:config>
		<aop:pointcut id="allManagerMethod" expression="execution (* com.bjpowernode.usermgr.manager.*.*)"/>
		<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
	</aop:config>
	
	<!-- 事務的傳播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
		<tx:method name="add*" propagation="REQUIRED"/>
		<tx:method name="del*" propagation="REQUIRED"/>
		<tx:method name="modify*" propagation="REQUIRED"/>
		<tx:method name="*" propagation="REQUIRED" read-only="true"/>
	</tx:advice>
</beans> 
	</span></span>

  程式設計式事務跟宣告式事務試用場景不同,有很少的事務操作時,程式設計式事務比較合適,針對性比較強;如果應用中存在大量事務操作,那麼宣告式事務管理通常是值得的,它將事務管理與業務邏輯隔離,配置成本極大降低。



相關文章