Spring事务配置的五种方式
2015-06-19 17:22
645 查看
http://www.blogjava.net/robbie/archive/2009/04/05/264003.html
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
总结如下:
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
具体如下图:
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个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/aop http://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/aop http://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/aop http://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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://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();
}
}
评论:
# re: Spring事务配置的五种方式 2009-04-05
19:41 | heyang
请问第一个图是拿什么软件画的? 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-05
19:47 | The Matrix
@heyang
Mindjet7.0,呵呵 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-06
10:13 | 虎啸龙吟
用什么画的图啊? 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-06
16:00 | 雨奏
@The Matrix
请问能否再简要说说这几种方式各自的好处与不足,或适用的场景?谢谢 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-06
23:00 | The Matrix
@雨奏
第一种方式与第二种方式是类似的,在所有方式中,第一种方式所需写的配置文件最多。
在Spring2.0时,一般都采用方式三,主要带来的好处就是配置文件的量变小。
在Spring2.5时,可以采用方式五,这样基本可以做到0配置了:) 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-08
10:53 | 雨奏
@The Matrix
谢谢你的耐心解答。目前我倒是常用第4种方式 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-17
12:50 | Woden
我想请教一个疑问:
假如我采用了第四种配置方式,然后我在某一个类*.dao.Test中调用了两个对象,诸如*.dao.UserDao和*.dao.RoleDao,那么此时的事物拦截机制是怎样?
如:
Test中有方法:
execute(){
userDao.insert();
roleDao.insert();
}
那么这个execute是否算一个事务?
望解答。多谢。 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-17
19:54 | The Matrix
@Woden
如果事务拦截机制对Test类中的execute方法生效,那么两个dao的insert方法是在一个事务,否则两个dao的insert方法就不在一个事务中。 回复 更多评论
# re: Spring事务配置的五种方式 2009-05-01
10:36 | 心梦帆影
不错的文章,收藏了。有一个问题想请教你:
第五种方式中,如果UserDaoImpl类中有很多方法,但不是全部方法都加上事务,那应怎么处理? 回复 更多评论
# re: Spring事务配置的五种方式 2009-05-01
21:28 | The Matrix
@心梦帆影
没有测试,但我想是否可以只在方法上加@Transactional注解
最近太忙了,要同时面临好几件事情,兄弟有测试结果,可以告知我一下,呵呵 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2009-09-02 11:25 | bruce
收藏了,不错,慢慢研究 回复 更多评论
# re: Spring事务配置的五种方式 2009-09-02
21:42 | xxwinnie
收藏~ 慢慢消化~ 回复 更多评论
# re: Spring事务配置的五种方式 2009-09-04
09:43 | wuspace
如果使用了多个数据源的话,@Transactional到底哪个数据源的事务? 回复 更多评论
# re: Spring事务配置的五种方式 2009-09-22
17:53 | soonj
辛苦楼主。很有奉献精神,学习!! 回复 更多评论
# re: Spring事务配置的五种方式 2009-12-20
14:20 | oyp
非常感谢,来得及时, 回复 更多评论
# re: Spring事务配置的五种方式 2009-12-30
13:59 | zhangleipd
文章很好,感谢楼主奉献精神 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2010-01-20 20:05 | nassir
确实写得很不错 回复 更多评论
# re: Spring事务配置的五种方式 2010-01-22
17:25 | pecal
bz的文章写的不错,请问可以转载吗? 会写转载地址的 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2010-03-18 15:49 | wasw100
很详细,以前只知其然,不知其所以然,现在明白点了,以后再细看 回复 更多评论
# re: Spring事务配置的五种方式 2010-03-23
14:39 | Matt
谢谢楼主的分享。 回复 更多评论
# re: Spring事务配置的五种方式 2010-04-08
13:43 | phe441
觉得第三、四种比较方便,好用 回复 更多评论
# re: Spring事务配置的五种方式 2010-04-15
13:37 | 隔叶黄莺
我一般用第五种,借问一下楼主,我在使用第五种的时候报错了,错误是:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personDao' defined in file [E:\workspace\TestSpring\bin\com\unmi\dao\impl\PersonDaoImpl.class]: Invocation of init method failed; nested exception
is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1403)
。.. more
不知道是什么原因,要如何解决呢? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2010-07-21 10:28 | Teddy
很好的总结,感谢楼主! 回复 更多评论
# re: Spring事务配置的五种方式 2010-08-19
11:09 | limj
我们现在用的是第五种方式吗?
第五种的第一部分 <!-- 定义事务管理器(声明式的事务) --> 是需要自己写的吗? 回复 更多评论
# re: Spring事务配置的五种方式 2010-08-31
09:21 | 周龙
使用第五种方式在spring3.X hibernate3.X下@Transactional不能工作,是jar包冲突还是?(springsource 文档貌似有说过不能保证@Transactional都有效) 回复 更多评论
# re: Spring事务配置的五种方式 2010-09-15
10:00 | sdf
@heyang
用铅笔画的 回复 更多评论
# re: Spring事务配置的五种方式 2010-09-19
11:30 | java程序员
好文章,学习了, 回复 更多评论
# re: Spring事务配置的五种方式 2010-12-30
15:10 | aguai0
说的好,不如做的好! 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-01
17:10 | hc
bluesky?莫非是hx的 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-16
14:52 | 谢彧
学习啦 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-16
16:03 | easy518网址导航
我听着陈瑞的歌曲,看完上面文章,很高效率的看完了。
人要有点坚持啊,不能三心二意啊。
咎由自取——–日本大地震的真正原因!!!
http://www.easy518.com/bbs/?p=90 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-17
17:56 | 阿斯顿发
最好的配置当然是第4种tx配置。 回复 更多评论
# re: Spring事务配置的五种方式 2011-04-28
11:59 | easy518
android学习群:118615483,flex群:47964236
回复 更多评论
# re: Spring事务配置的五种方式 2011-04-28
12:36 | easy518网址导航
http://www.easy518.com 回复 更多评论
# re: Spring事务配置的五种方式 2011-05-26
17:03 | joynet007
请问第五种方式你确定你的可以么?我的怎么不行呢!我也是按照你的方法配置的啊!? 回复 更多评论
# re: Spring事务配置的五种方式 2011-05-27
11:48 | sunyi
@joynet007
还要加上这句话。
<tx:annotation-driven transaction-manager="transactionManager" /> 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-08-17 11:43 | a
你怎么把@Transactional
写在类上了?不是写在方法上吗? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-08-22 13:26 | rick
正在学习,很好总结 tks LZ
回复 更多评论
# re: Spring事务配置的五种方式 2011-10-21
12:45 | Jeelon
LZ 我用的你写的第二种 可以麻烦你看看我的这个错误么?
这是地址问题都在里面了:
http://topic.csdn.net/u/20111020/22/58f0865c-44b0-4aff-8c9a-59edaab3c7f2.html
感激不尽哦! 回复 更多评论
# re: Spring事务配置的五种方式 2011-11-03
14:28 | xiaohaiben007
真不错。。。。感谢。。。 回复 更多评论
# re: Spring事务配置的五种方式 2011-11-03
18:37 | tian012
@xiaohaiben007
牛人,非常感谢 回复 更多评论
# re: Spring事务配置的五种方式 2011-11-03
18:39 | tian012
牛人,非常感谢 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-11-05 15:10 | xx
强 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-11-07 15:17 | 啊啊
犀利,困惑我2天的东西,被你点通了 回复 更多评论
# re: Spring事务配置的五种方式 2012-02-15
21:05 | laifu901
哥 回复 更多评论
# re: Spring事务配置的第五种方式 2012-02-23
15:33 | qch
第五种方式 我试了试 在3.0下面,不德行 回复 更多评论
# re: Spring事务配置的五种方式 2012-05-21
11:13 | free8rt
@Transactional加在方法上就可以给某个方法加上事物了,比如增删改,加在service类上就是给所有方法都加上事物了 回复 更多评论
# re: Spring事务配置的五种方式 2012-08-09
18:47 | yushan
很不错,顶一个 回复 更多评论
# re: Spring事务配置的五种方式 2012-09-03
11:47 | 北京青年
强大 回复 更多评论
# re: Spring事务配置的五种方式 2012-10-16
14:23 | webtomos
@heyang思维导图 回复 更多评论
# re: Spring事务配置的五种方式 2012-11-29
09:51 | zeda
肯定是用第五种啦 呵呵 不过只是基于java5才能用 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
10:21 | jianxia612
你这个有jdbctemplate的示例程序? 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
11:22 | jianxia612
楼主 你的第二种配置方式 <!-- 配置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> 能否提供一下spring jdbctemplate方式配置呢 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
11:30 | jianxia612
还一个问题比较疑虑 userDao之中的name是自己可以随意命名的吧 你看我的jdbc配置如下 <bean id="taskServer" parent="transactionBase" class="com.abc.DataGatherTaskServer">
<property name="taskDao" >
<ref bean="TaskDao" />
</property>
</bean> 其中transactionBase 在启动tomcat会出错!nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'transactionManager' of bean class [com.abc.TaskServer]: Bean property 'transactionManager' is not writable or has an invalid
setter method. Does the parameter type of the setter match the return type of the getter? 此处错误是我在dao之中为get,set 'transactionManager' ? 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
15:25 | jianxia612
@jianxia612
针对第二种已经找到设置方法:<bean id="taskServer" parent="transactionBase" >
<property name="target">
<bean class="com.abc.server.TaskServer">
<property name="taskDao" ref="taskDao"/>
</bean>
</property>
</bean> 回复 更多评论
# re: Spring事务配置的五种方式 2013-02-03
11:48 | vicky
挺细致的 回复 更多评论
# re: Spring事务配置的五种方式 2013-03-01
22:44 | ZL
很有用,非常感谢! 回复 更多评论
# re: Spring事务配置的五种方式 2013-05-03
10:13 | 高寒
博主讲的意思是对的,但是事务一般是不能加到dao层的,应该加到service层,还有就是,博主没有写出来,rollbackfor与noRollbackfor等等 回复 更多评论
# re: Spring事务配置的五种方式 2013-05-05
17:17 | 赵靖
楼主,请问楼主,个人感觉第四种方式只要是把规则配置好了,其他需要使用事务的类,方法,就不用做多余的配置了,第五种方法是全注解,每个需要做事务处理的方法都需要手动配置注解,是不是第四种方法比第五种方法更好? 回复 更多评论
# re: Spring事务配置的五种方式 2013-05-31
00:17 | jzp
讲解的很好,非常感谢!! 回复 更多评论
# re: Spring事务配置的五种方式 2013-06-22
22:35 | chen jq
非常感谢分享 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-07-07 21:52 | Terry
想在业务层service中做个事务,一个service调用多个dao时,如果有一个dao出错,其他全部回滚。采用第三种方法可以实现吗,要怎么配置? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-07-19 15:14 | a
a 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-07-19 15:14 | a
aa 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-09-02 15:20 | guoguo
我使用的是第四种方式,没有用hibernate,其他配置的都一样,事务还是没控制住,请问这可能是什么原因呢? 回复 更多评论
# re: Spring事务配置的五种方式 2013-09-05
09:24 | liangtu33
@guoguo
很有可能是其他xml文件干扰了。 回复 更多评论
# re: Spring事务配置的五种方式 2013-09-05
09:46 | liangtu33
第一种方式中<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
GeneratorDao是接口吗?
你是不是没有service层,直接在dao层加的事务? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-12-05 17:15 | Ray
确实是可以在方法上加这个注解的@The Matrix
回复 更多评论
# re: Spring事务配置的五种方式 2013-12-06
18:09 | 落叶飞星
@周龙
我也是用地五种配置,事物也不起作用,请赐教 回复 更多评论
# re: Spring事务配置的五种方式 2013-12-06
18:10 | 落叶飞星
@sunyi
我都是按照上面的配置做的配置,但事物不起作用 回复 更多评论
# re: Spring事务配置的五种方式 2014-01-07
14:47 | aluomaidi
@落叶飞星还需要加事务注解支持<tx:annotation-driven transaction-manager="transactionManager" />
回复 更多评论
# re: Spring事务配置的五种方式 2014-01-23
15:25 | ss
ssss 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-04
14:56 | winson
得分析下这几种方式的工作原理和优缺点啊。 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-05
16:53 | 姚娜
@The Matrix
可以的 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-09
23:04 | zuidaima
spring代码下载:http://www.zuidaima.com/share/search.htm?key=spring 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-12
10:35 | jialy
不错的文章! 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-21
10:58 | sdfa
怎么收藏啊 回复 更多评论
# re: Spring事务配置的五种方式 2014-06-06
14:26 | 风起云追
@Terry
遇到同样的问题,有没有解决? 回复 更多评论
# re: Spring事务配置的五种方式 2015-01-28
11:48 | qu
楼上说的按照上面的配置做的配置,但事物不起作用,原因如下:
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db?characterEncoding=utf8"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
要设置dataSource 的自动提交为false,让spring 去管理提交,自动提交默认是true 回复 更多评论
# re: Spring事务配置的五种方式 2015-04-08
16:03 | Queena
[align=left]楼主你好,能不能分享一个aop事务管理的小项目,包括写不成功回滚异常的,谢谢了。 回复 更多评论[/align]
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
总结如下:
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
具体如下图:
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个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/aop http://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/aop http://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/aop http://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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://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();
}
}
评论:
# re: Spring事务配置的五种方式 2009-04-05
19:41 | heyang
请问第一个图是拿什么软件画的? 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-05
19:47 | The Matrix
@heyang
Mindjet7.0,呵呵 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-06
10:13 | 虎啸龙吟
用什么画的图啊? 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-06
16:00 | 雨奏
@The Matrix
请问能否再简要说说这几种方式各自的好处与不足,或适用的场景?谢谢 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-06
23:00 | The Matrix
@雨奏
第一种方式与第二种方式是类似的,在所有方式中,第一种方式所需写的配置文件最多。
在Spring2.0时,一般都采用方式三,主要带来的好处就是配置文件的量变小。
在Spring2.5时,可以采用方式五,这样基本可以做到0配置了:) 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-08
10:53 | 雨奏
@The Matrix
谢谢你的耐心解答。目前我倒是常用第4种方式 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-17
12:50 | Woden
我想请教一个疑问:
假如我采用了第四种配置方式,然后我在某一个类*.dao.Test中调用了两个对象,诸如*.dao.UserDao和*.dao.RoleDao,那么此时的事物拦截机制是怎样?
如:
Test中有方法:
execute(){
userDao.insert();
roleDao.insert();
}
那么这个execute是否算一个事务?
望解答。多谢。 回复 更多评论
# re: Spring事务配置的五种方式 2009-04-17
19:54 | The Matrix
@Woden
如果事务拦截机制对Test类中的execute方法生效,那么两个dao的insert方法是在一个事务,否则两个dao的insert方法就不在一个事务中。 回复 更多评论
# re: Spring事务配置的五种方式 2009-05-01
10:36 | 心梦帆影
不错的文章,收藏了。有一个问题想请教你:
第五种方式中,如果UserDaoImpl类中有很多方法,但不是全部方法都加上事务,那应怎么处理? 回复 更多评论
# re: Spring事务配置的五种方式 2009-05-01
21:28 | The Matrix
@心梦帆影
没有测试,但我想是否可以只在方法上加@Transactional注解
最近太忙了,要同时面临好几件事情,兄弟有测试结果,可以告知我一下,呵呵 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2009-09-02 11:25 | bruce
收藏了,不错,慢慢研究 回复 更多评论
# re: Spring事务配置的五种方式 2009-09-02
21:42 | xxwinnie
收藏~ 慢慢消化~ 回复 更多评论
# re: Spring事务配置的五种方式 2009-09-04
09:43 | wuspace
如果使用了多个数据源的话,@Transactional到底哪个数据源的事务? 回复 更多评论
# re: Spring事务配置的五种方式 2009-09-22
17:53 | soonj
辛苦楼主。很有奉献精神,学习!! 回复 更多评论
# re: Spring事务配置的五种方式 2009-12-20
14:20 | oyp
非常感谢,来得及时, 回复 更多评论
# re: Spring事务配置的五种方式 2009-12-30
13:59 | zhangleipd
文章很好,感谢楼主奉献精神 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2010-01-20 20:05 | nassir
确实写得很不错 回复 更多评论
# re: Spring事务配置的五种方式 2010-01-22
17:25 | pecal
bz的文章写的不错,请问可以转载吗? 会写转载地址的 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2010-03-18 15:49 | wasw100
很详细,以前只知其然,不知其所以然,现在明白点了,以后再细看 回复 更多评论
# re: Spring事务配置的五种方式 2010-03-23
14:39 | Matt
谢谢楼主的分享。 回复 更多评论
# re: Spring事务配置的五种方式 2010-04-08
13:43 | phe441
觉得第三、四种比较方便,好用 回复 更多评论
# re: Spring事务配置的五种方式 2010-04-15
13:37 | 隔叶黄莺
我一般用第五种,借问一下楼主,我在使用第五种的时候报错了,错误是:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personDao' defined in file [E:\workspace\TestSpring\bin\com\unmi\dao\impl\PersonDaoImpl.class]: Invocation of init method failed; nested exception
is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1403)
。.. more
不知道是什么原因,要如何解决呢? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2010-07-21 10:28 | Teddy
很好的总结,感谢楼主! 回复 更多评论
# re: Spring事务配置的五种方式 2010-08-19
11:09 | limj
我们现在用的是第五种方式吗?
第五种的第一部分 <!-- 定义事务管理器(声明式的事务) --> 是需要自己写的吗? 回复 更多评论
# re: Spring事务配置的五种方式 2010-08-31
09:21 | 周龙
使用第五种方式在spring3.X hibernate3.X下@Transactional不能工作,是jar包冲突还是?(springsource 文档貌似有说过不能保证@Transactional都有效) 回复 更多评论
# re: Spring事务配置的五种方式 2010-09-15
10:00 | sdf
@heyang
用铅笔画的 回复 更多评论
# re: Spring事务配置的五种方式 2010-09-19
11:30 | java程序员
好文章,学习了, 回复 更多评论
# re: Spring事务配置的五种方式 2010-12-30
15:10 | aguai0
说的好,不如做的好! 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-01
17:10 | hc
bluesky?莫非是hx的 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-16
14:52 | 谢彧
学习啦 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-16
16:03 | easy518网址导航
我听着陈瑞的歌曲,看完上面文章,很高效率的看完了。
人要有点坚持啊,不能三心二意啊。
咎由自取——–日本大地震的真正原因!!!
http://www.easy518.com/bbs/?p=90 回复 更多评论
# re: Spring事务配置的五种方式 2011-03-17
17:56 | 阿斯顿发
最好的配置当然是第4种tx配置。 回复 更多评论
# re: Spring事务配置的五种方式 2011-04-28
11:59 | easy518
android学习群:118615483,flex群:47964236
回复 更多评论
# re: Spring事务配置的五种方式 2011-04-28
12:36 | easy518网址导航
http://www.easy518.com 回复 更多评论
# re: Spring事务配置的五种方式 2011-05-26
17:03 | joynet007
请问第五种方式你确定你的可以么?我的怎么不行呢!我也是按照你的方法配置的啊!? 回复 更多评论
# re: Spring事务配置的五种方式 2011-05-27
11:48 | sunyi
@joynet007
还要加上这句话。
<tx:annotation-driven transaction-manager="transactionManager" /> 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-08-17 11:43 | a
你怎么把@Transactional
写在类上了?不是写在方法上吗? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-08-22 13:26 | rick
正在学习,很好总结 tks LZ
回复 更多评论
# re: Spring事务配置的五种方式 2011-10-21
12:45 | Jeelon
LZ 我用的你写的第二种 可以麻烦你看看我的这个错误么?
这是地址问题都在里面了:
http://topic.csdn.net/u/20111020/22/58f0865c-44b0-4aff-8c9a-59edaab3c7f2.html
感激不尽哦! 回复 更多评论
# re: Spring事务配置的五种方式 2011-11-03
14:28 | xiaohaiben007
真不错。。。。感谢。。。 回复 更多评论
# re: Spring事务配置的五种方式 2011-11-03
18:37 | tian012
@xiaohaiben007
牛人,非常感谢 回复 更多评论
# re: Spring事务配置的五种方式 2011-11-03
18:39 | tian012
牛人,非常感谢 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-11-05 15:10 | xx
强 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2011-11-07 15:17 | 啊啊
犀利,困惑我2天的东西,被你点通了 回复 更多评论
# re: Spring事务配置的五种方式 2012-02-15
21:05 | laifu901
哥 回复 更多评论
# re: Spring事务配置的第五种方式 2012-02-23
15:33 | qch
第五种方式 我试了试 在3.0下面,不德行 回复 更多评论
# re: Spring事务配置的五种方式 2012-05-21
11:13 | free8rt
@Transactional加在方法上就可以给某个方法加上事物了,比如增删改,加在service类上就是给所有方法都加上事物了 回复 更多评论
# re: Spring事务配置的五种方式 2012-08-09
18:47 | yushan
很不错,顶一个 回复 更多评论
# re: Spring事务配置的五种方式 2012-09-03
11:47 | 北京青年
强大 回复 更多评论
# re: Spring事务配置的五种方式 2012-10-16
14:23 | webtomos
@heyang思维导图 回复 更多评论
# re: Spring事务配置的五种方式 2012-11-29
09:51 | zeda
肯定是用第五种啦 呵呵 不过只是基于java5才能用 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
10:21 | jianxia612
你这个有jdbctemplate的示例程序? 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
11:22 | jianxia612
楼主 你的第二种配置方式 <!-- 配置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> 能否提供一下spring jdbctemplate方式配置呢 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
11:30 | jianxia612
还一个问题比较疑虑 userDao之中的name是自己可以随意命名的吧 你看我的jdbc配置如下 <bean id="taskServer" parent="transactionBase" class="com.abc.DataGatherTaskServer">
<property name="taskDao" >
<ref bean="TaskDao" />
</property>
</bean> 其中transactionBase 在启动tomcat会出错!nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'transactionManager' of bean class [com.abc.TaskServer]: Bean property 'transactionManager' is not writable or has an invalid
setter method. Does the parameter type of the setter match the return type of the getter? 此处错误是我在dao之中为get,set 'transactionManager' ? 回复 更多评论
# re: Spring事务配置的五种方式 2012-12-04
15:25 | jianxia612
@jianxia612
针对第二种已经找到设置方法:<bean id="taskServer" parent="transactionBase" >
<property name="target">
<bean class="com.abc.server.TaskServer">
<property name="taskDao" ref="taskDao"/>
</bean>
</property>
</bean> 回复 更多评论
# re: Spring事务配置的五种方式 2013-02-03
11:48 | vicky
挺细致的 回复 更多评论
# re: Spring事务配置的五种方式 2013-03-01
22:44 | ZL
很有用,非常感谢! 回复 更多评论
# re: Spring事务配置的五种方式 2013-05-03
10:13 | 高寒
博主讲的意思是对的,但是事务一般是不能加到dao层的,应该加到service层,还有就是,博主没有写出来,rollbackfor与noRollbackfor等等 回复 更多评论
# re: Spring事务配置的五种方式 2013-05-05
17:17 | 赵靖
楼主,请问楼主,个人感觉第四种方式只要是把规则配置好了,其他需要使用事务的类,方法,就不用做多余的配置了,第五种方法是全注解,每个需要做事务处理的方法都需要手动配置注解,是不是第四种方法比第五种方法更好? 回复 更多评论
# re: Spring事务配置的五种方式 2013-05-31
00:17 | jzp
讲解的很好,非常感谢!! 回复 更多评论
# re: Spring事务配置的五种方式 2013-06-22
22:35 | chen jq
非常感谢分享 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-07-07 21:52 | Terry
想在业务层service中做个事务,一个service调用多个dao时,如果有一个dao出错,其他全部回滚。采用第三种方法可以实现吗,要怎么配置? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-07-19 15:14 | a
a 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-07-19 15:14 | a
aa 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-09-02 15:20 | guoguo
我使用的是第四种方式,没有用hibernate,其他配置的都一样,事务还是没控制住,请问这可能是什么原因呢? 回复 更多评论
# re: Spring事务配置的五种方式 2013-09-05
09:24 | liangtu33
@guoguo
很有可能是其他xml文件干扰了。 回复 更多评论
# re: Spring事务配置的五种方式 2013-09-05
09:46 | liangtu33
第一种方式中<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
GeneratorDao是接口吗?
你是不是没有service层,直接在dao层加的事务? 回复 更多评论
# re: Spring事务配置的五种方式[未登录]
2013-12-05 17:15 | Ray
确实是可以在方法上加这个注解的@The Matrix
回复 更多评论
# re: Spring事务配置的五种方式 2013-12-06
18:09 | 落叶飞星
@周龙
我也是用地五种配置,事物也不起作用,请赐教 回复 更多评论
# re: Spring事务配置的五种方式 2013-12-06
18:10 | 落叶飞星
@sunyi
我都是按照上面的配置做的配置,但事物不起作用 回复 更多评论
# re: Spring事务配置的五种方式 2014-01-07
14:47 | aluomaidi
@落叶飞星还需要加事务注解支持<tx:annotation-driven transaction-manager="transactionManager" />
回复 更多评论
# re: Spring事务配置的五种方式 2014-01-23
15:25 | ss
ssss 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-04
14:56 | winson
得分析下这几种方式的工作原理和优缺点啊。 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-05
16:53 | 姚娜
@The Matrix
可以的 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-09
23:04 | zuidaima
spring代码下载:http://www.zuidaima.com/share/search.htm?key=spring 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-12
10:35 | jialy
不错的文章! 回复 更多评论
# re: Spring事务配置的五种方式 2014-05-21
10:58 | sdfa
怎么收藏啊 回复 更多评论
# re: Spring事务配置的五种方式 2014-06-06
14:26 | 风起云追
@Terry
遇到同样的问题,有没有解决? 回复 更多评论
# re: Spring事务配置的五种方式 2015-01-28
11:48 | qu
楼上说的按照上面的配置做的配置,但事物不起作用,原因如下:
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db?characterEncoding=utf8"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
要设置dataSource 的自动提交为false,让spring 去管理提交,自动提交默认是true 回复 更多评论
# re: Spring事务配置的五种方式 2015-04-08
16:03 | Queena
[align=left]楼主你好,能不能分享一个aop事务管理的小项目,包括写不成功回滚异常的,谢谢了。 回复 更多评论[/align]
相关文章推荐
- eclipse提交新项目到github
- 《Java知识点列表》V1.0
- java基础系列:System.getenv()
- Java关键字学习总结
- java连接mysql数据库的方法
- 使用Spring的LdapTemplate进行LDAP操作
- Java equals()和hashCode()重写总结
- Java深入浅出系列(一)——浅析Java反射机制
- velocity中调用Java代码无效或者无法debug
- java基础之 集合
- 简易Java(04):Java如何进行静态类型检查?
- java正则表达式 前后查找
- Java 中利用 axis2 进行webservice 客户端编写
- Quartz使用-入门使用(java定时任务实现)
- Java定时任务--定时调用方法(servlet)
- java用递归实现输入字符串反向输出
- 技术演绎之 [java] 重点总结
- 根据点画线java
- 技术演绎之 [java] java 重载递归
- 技术演绎之 [ java ] java 字符串