程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> spring的事務管理配置

spring的事務管理配置

編輯:關於JAVA

一般的,我們把事務配在service層,利用service的業務邏輯接口統一的管理。

為什麼不用在dao層呢?

因為一個service有可能調用多個dao,而這多個dao有可能相互聯系,有時候一個操作需要調用多次數據庫,但是這多次調用要麼全提交,要麼全回滾。

因此,在dao層調用事務理論上說不是一個很明智的選擇。應該有業務邏輯層service層負責事務,統一處理。

Spring配置文件中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,

無論哪種配置方式,一般變化的只是代理機制這部分。

DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,比如使用Hibernate進行數據訪問時,

DataSource實際為SessionFactory,TransactionManager的實現為 HibernateTransactionManager。

第一種方式:每個Bean都有一個代理

<?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: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-2.5.xsd  
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-2.5.xsd  
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
      
      
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
<property name="configLocation" value="classpath:hibernate.cfg.xml"  />    
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"  />   
</bean>    
      
      
<!-- 定義事務管理器(聲明式的事務) -->    
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<!-- 配置DAO -->   
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<bean id="userDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
<!-- 配置事務管理器 -->    
<property name="transactionManager" ref="transactionManager"  />       
<property name="target" ref="userDaoTarget"  />    
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao"  />   
<!-- 配置事務屬性 -->    
<property name="transactionAttributes">    
<props>    
<prop key="*">PROPAGATION_REQUIRED</prop>   
</props>    
</property>    
</bean>    
</beans>

第二種方式:所有Bean共享一個代理基類

<?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: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-2.5.xsd  
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-2.5.xsd  
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
      
      
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
<property name="configLocation" value="classpath:hibernate.cfg.xml"  />    
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"  />   
</bean>    
      
      
<!-- 定義事務管理器(聲明式的事務) -->    
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<bean id="transactionBase"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init="true" abstract="true">    
<!-- 配置事務管理器 -->    
<property name="transactionManager" ref="transactionManager"  />    
<!-- 配置事務屬性 -->    
<property name="transactionAttributes">    
<props>    
<prop key="*">PROPAGATION_REQUIRED</prop>    
</props>    
</property>    
</bean>      
      
      
<!-- 配置DAO -->   
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<bean id="userDao" parent="transactionBase" >    
<property name="target" ref="userDaoTarget"  />     
</bean>   
</beans>

第三種方式:使用攔截器

<?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: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-2.5.xsd  
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-2.5.xsd  
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
      
      
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
<property name="configLocation" value="classpath:hibernate.cfg.xml"  />    
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"  />   
</bean>    
      
      
<!-- 定義事務管理器(聲明式的事務) -->    
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">    
<property name="transactionManager" ref="transactionManager"  />    
<!-- 配置事務屬性 -->    
<property name="transactionAttributes">    
<props>    
<prop key="*">PROPAGATION_REQUIRED</prop>    
</props>    
</property>    
</bean>   
      
      
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
<property name="beanNames">    
<list>    
<value>*Dao</value>   
</list>    
</property>    
<property name="interceptorNames">    
<list>    
<value>transactionInterceptor</value>    
</list>    
</property>    
</bean>    
      
      
<!-- 配置DAO -->   
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
</beans>

第四種方式:使用tx標簽配置的攔截器

<?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:context="http://www.springframework.org/schema/context"
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.5.xsd  
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-2.5.xsd  
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
      
      
<context:annotation-config  />   
<context:component-scan base-package="com.bluesky"  />   
      
      
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
<property name="configLocation" value="classpath:hibernate.cfg.xml"  />    
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"  />   
</bean>    
      
      
<!-- 定義事務管理器(聲明式的事務) -->    
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<tx:advice id="txAdvice" transaction-manager="transactionManager">   
<tx:attributes>   
<tx:method name="*" propagation="REQUIRED"  />   
</tx:attributes>   
</tx:advice>   
      
      
<aop:config>   
<aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))"  />   
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts"  />          
</aop:config>        
</beans>

第五種方式:全注解

<?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:context="http://www.springframework.org/schema/context"
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.5.xsd  
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-2.5.xsd  
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
      
      
<context:annotation-config  />   
<context:component-scan base-package="com.bluesky"  />   
      
      
<tx:annotation-driven transaction-manager="transactionManager" />   
      
      
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
<property name="configLocation" value="classpath:hibernate.cfg.xml"  />    
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"  />   
</bean>    
      
      
<!-- 定義事務管理器(聲明式的事務) -->    
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
</beans>

此時在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;   
      
      
import java.util.List;   
      
      
import org.hibernate.SessionFactory;   
import org.springframework.beans.factory.annotation.Autowired;   
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
import org.springframework.stereotype.Component;   
      
      
import com.bluesky.spring.domain.User;   
      
      
@Transactional
@Component("userDao")   
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {   
      
      
public List<User> listUsers() {   
return this.getSession().createQuery("from User").list();   
}   
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved