Spring 事务管理的配置
2008-05-12 18:14
477 查看
Spring 事务管理的配置
看了上面同事学习 spring 的笔记后自己也觉得有新的理解,从什么地方说起呢?就从 spring 的事务配置说起吧。那么我们看看 contextConfig.xml 吧。
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>mf/org/user/User.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class=" mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
以上就是一个完整的 spring 配置,是不是很熟悉呢,这里是用的 Appfuse 的框架,呵呵。有那么点味道吧。
首先我们看看
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
这一个 bean 让 spring 为我们注入了什么呢?事务,对!我们把 hibernate 的事务注入到了 spring 的 IOC 容器之中了。然后我们再看看:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这个 bean 又是让 spring 为我们注入了了什么呢?事务代理,对了!我们把事务的代理交给一个 txProxyTemplate 的去做了,这样的好处我待会再说,现在我们看看下面的一些配置信息。
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的: PROPAGATION_REQUIRED,-Exception 。
有人就会说 PROPAGATION_REQUIRED 就可以回滚事务啊,为什么加上 ,-Exception 呢?其实我以前也时这样想的,但这是不完全正确的,当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了,但是当我们的业务逻辑中要求我们在一个事务代理中开启两个事务,这两个事务表面上没有联系,但是实际中又有很多联系的,比如我们上传附件和提交文档,这样两个操作我们可以分开,因为他们不是往一个表里插入数据,我们又不希望这两个操作写在一个 service 里,这样我们要是有一个业务只要上传附件呢?那样我们是不是又要再写一个方法啊!所以在开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了,这样就完全满足我们的要求了,我也试过如果我写的是 PROPAGATION_REQUIRED,-SQLException 时,这样我们只会在出现 SQLException 时事务回顾,出现其他的异常事务就不回滚了,好在 spring 可以让我们写如异常的基类就可以做到捕获任何异常,这样我们就写 -Exception 好了。特殊情况在特殊处理吧。通用情况下我们还是这样的。
我们再看看:
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
当然我们也可以写成:
<bean id="userManager" parent="txProxyTemplate">
<property name="target">
<bean class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO">
<ref bean="userDao"/>
</property>
</bean>
</property>
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
这下我们解除以前的疑惑, parent="txProxyTemplate" 知道我们为什么在上面先写了 txProxyTemplate 的 bean 了吧,这样我们就没有必要再写一编了。是不是很方便? spring 的这些技巧还不只这些呢。这样我们就可以轻松利用以上这三个注入的类去做我们的逻辑了。
Spring 就是要我们注入实现类,然后使用接口操作,这样耦合性就不是那么强了,这也体现了 Spring 的工厂模式。而 AOP 的 manager 又象我们熟知的代理模式吧 !
3.注意要点
在写配置的时候注意各个 Manager 和 DAO 之间的关系,以及 <ref= ”” > 之间的关系,清晰里面的关系才能更好的配置
看了上面同事学习 spring 的笔记后自己也觉得有新的理解,从什么地方说起呢?就从 spring 的事务配置说起吧。那么我们看看 contextConfig.xml 吧。
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>mf/org/user/User.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class=" mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
以上就是一个完整的 spring 配置,是不是很熟悉呢,这里是用的 Appfuse 的框架,呵呵。有那么点味道吧。
首先我们看看
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
这一个 bean 让 spring 为我们注入了什么呢?事务,对!我们把 hibernate 的事务注入到了 spring 的 IOC 容器之中了。然后我们再看看:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这个 bean 又是让 spring 为我们注入了了什么呢?事务代理,对了!我们把事务的代理交给一个 txProxyTemplate 的去做了,这样的好处我待会再说,现在我们看看下面的一些配置信息。
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的: PROPAGATION_REQUIRED,-Exception 。
有人就会说 PROPAGATION_REQUIRED 就可以回滚事务啊,为什么加上 ,-Exception 呢?其实我以前也时这样想的,但这是不完全正确的,当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了,但是当我们的业务逻辑中要求我们在一个事务代理中开启两个事务,这两个事务表面上没有联系,但是实际中又有很多联系的,比如我们上传附件和提交文档,这样两个操作我们可以分开,因为他们不是往一个表里插入数据,我们又不希望这两个操作写在一个 service 里,这样我们要是有一个业务只要上传附件呢?那样我们是不是又要再写一个方法啊!所以在开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了,这样就完全满足我们的要求了,我也试过如果我写的是 PROPAGATION_REQUIRED,-SQLException 时,这样我们只会在出现 SQLException 时事务回顾,出现其他的异常事务就不回滚了,好在 spring 可以让我们写如异常的基类就可以做到捕获任何异常,这样我们就写 -Exception 好了。特殊情况在特殊处理吧。通用情况下我们还是这样的。
我们再看看:
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget"
class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
当然我们也可以写成:
<bean id="userManager" parent="txProxyTemplate">
<property name="target">
<bean class="mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO">
<ref bean="userDao"/>
</property>
</bean>
</property>
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
这下我们解除以前的疑惑, parent="txProxyTemplate" 知道我们为什么在上面先写了 txProxyTemplate 的 bean 了吧,这样我们就没有必要再写一编了。是不是很方便? spring 的这些技巧还不只这些呢。这样我们就可以轻松利用以上这三个注入的类去做我们的逻辑了。
Spring 就是要我们注入实现类,然后使用接口操作,这样耦合性就不是那么强了,这也体现了 Spring 的工厂模式。而 AOP 的 manager 又象我们熟知的代理模式吧 !
3.注意要点
在写配置的时候注意各个 Manager 和 DAO 之间的关系,以及 <ref= ”” > 之间的关系,清晰里面的关系才能更好的配置
相关文章推荐
- spring使用TransactionProxy配置声明式的事务管理
- spring 事务管理配置
- Spring入门之事务管理【一】XML配置文件方式
- spring 管理的事务。个人理解(SSH项目注解配置)
- Spring注解配置事务管理——问题
- Spring管理的事务:如何配置回滚及try catch情况下的回滚
- Spring事务管理中@Transactional的参数配置
- spring事物配置,声明式事务管理和基于@Transactional注解的使用(1)
- Spring管理 hibernate 事务配置的五种方式
- Spring的事务管理,applicationContext.xml中的配置
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- Spring配置事务管理和简化事务配置
- spring.net tx:advice 和 aop:config 配置事务 匹配名字的方法管理事务
- Spring 编程式事务管理xml文件配置问题org.springframework.beans.NotWritablePropertyException: Invalid property
- Spring3.0配置多个事务管理器(即操作多个数据源)的方法
- Spring 声明式事务管理 Annotation配置 xml文件
- spring事物配置,声明式事务管理和基于@Transactional注解的使用