框架有自己的事务,为什么Spring还需要ssm框架配置事务务

博客分类:
Connection conn =
DataSourceUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
Object retVal =
callback.doInConnection(conn);
conn.commit(); //提交事务
return retV
}catch (Exception e) {
conn.rollback();//回滚事务
}finally {
conn.close();
Session session =
Transaction transaction =
session = factory.openSession();
//开启事务
transaction = session.beginTransaction();
transation.begin();
session.save(user);
transaction.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();//回滚事务
session.close();
缺点:不一致的事务管理,复杂
2、高层次解决方案(编程式实现事务)
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionE
void commit(TransactionStatus status) throws TransactionE
void rollback(TransactionStatus status) throws TransactionE
//1.获取事务管理器
PlatformTransactionManager txManager = (PlatformTransactionManager)
ctx.getBean("txManager");
//2.定义事务属性
DefaultTransactionDefinition td = new DefaultTransactionDefinition();
td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
//3开启事务,得到事务状态
TransactionStatus status = txManager.getTransaction(td);
//4.执行数据库操作
System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
//5、提交事务
txManager.commit(status);
}catch (Exception e) {
//6、回滚事务
txManager.rollback(status);
3、高层次解决方案(模板解决方案)
//1.获取事务管理器
PlatformTransactionManager txManager = (PlatformTransactionManager)
ctx.getBean("txManager");
//2、定义事务管理的模板
TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
//3.定义事务属性
transactionTemplate.
setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
//4.回调,执行真正的数据库操作,如果需要返回值需要在回调里返回
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
//5.执行数据库操作
System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
4、AOP解决方案
nSpring框架提供了一致的事务管理抽象,这带来了以下好处:
1:为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO
2:支持声明式事务管理
3:提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API
4:非常好地整合Spring的各种数据访问抽象
实施事务的步骤
1、定义(资源)DataSource/SessionFactory……
2、定义事务管理器(管理资源的事务)
3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性
4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象
5、Spring织入事务通知到目标对象(AOP代理)
实施流程:
更多相关知识请参考:
浏览 12877
jinnianshilongnian 写道markhai_85 写道jinnianshilongnian,你好。问一个问题:一个方法有多个save,每个save不同的对象最后一个save时发生异常,怎么把前面已save好的数据进行回滚呢?求解惑!谢谢了!配置上事务传播即可& 你可以参考本博客的 事务配置部分我的用的是hibernate4,dao方法中:public void save(Object entity){
if(ObjectUitls.isEmpty(entity))
Session session = getSession();
Transaction txn = getTransaction(session);
session.save(entity);
close(txn, session); }好像已经不能用spring3.2 了吧我再仔细看看
markhai_85 写道jinnianshilongnian,你好。问一个问题:一个方法有多个save,每个save不同的对象最后一个save时发生异常,怎么把前面已save好的数据进行回滚呢?求解惑!谢谢了!配置上事务传播即可& 你可以参考本博客的 事务配置部分我的用的是hibernate4,dao方法中:public void save(Object entity){
if(ObjectUitls.isEmpty(entity))
Session session = getSession();
Transaction txn = getTransaction(session);
session.save(entity);
close(txn, session); }好像已经不能用spring3.2 了吧
jinnianshilongnian,你好。问一个问题:一个方法有多个save,每个save不同的对象最后一个save时发生异常,怎么把前面已save好的数据进行回滚呢?求解惑!谢谢了!配置上事务传播即可& 你可以参考本博客的 事务配置部分
,大牛就是大牛不敢不敢
jinnianshilongnian
浏览量:1921382
浏览量:2425430
浏览量:5024568
浏览量:193989
浏览量:1382638
浏览量:203395
浏览量:4508893
浏览量:534818
浏览量:581380
基于shiro最新版、SpringBoot开发的一套权限系统, ...
cx 写道adc333 写道为什么我验证“l ...
gududed 写道用testFirstOneSuccessf ...
用例子中的nginx的配置文件,会报404,配置文件中loca ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'51CTO旗下网站
Spring事务配置的五种方式
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
作者:dawn_sky来源:dawn_sky的博客| 10:25
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
总结如下:
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
具体如下图:
Spring事务配置
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
&version=&1.0&&encoding=&UTF-8&&&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&&&&&&&&id=&sessionFactory&&&&&&&&&&&&&&&class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&&&&&&&&&&&name=&configLocation&&value=&classpath:hibernate.cfg.xml&&&&&&&&&&&&&name=&configurationClass&&value=&org.hibernate.cfg.AnnotationConfiguration&&&&&&&&&&&&&&&&&&&&&id=&transactionManager&&&&&&&&&&class=&org.springframework.orm.hibernate3.HibernateTransactionManager&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&&&&&&&&&&id=&userDaoTarget&&class=&com.bluesky.spring.dao.UserDaoImpl&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&&&&&id=&userDao&&&&&&&&&&&class=&org.springframework.transaction.interceptor.TransactionProxyFactoryBean&&&&&&&&&&&&&&&&&&&&&&&&&&&&name=&transactionManager&&ref=&transactionManager&&&&&&&&&&&&&&&&name=&target&&ref=&userDaoTarget&&&&&&&&&&&&&&name=&proxyInterfaces&&value=&com.bluesky.spring.dao.GeneratorDao&&&&&&&&&&&&&&&&&&&&&&name=&transactionAttributes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&key=&*&PROPAGATION_REQUIRED&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
第二种方式:所有Bean共享一个代理基类
&version=&1.0&&encoding=&UTF-8&&&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&&&&&&&&id=&sessionFactory&&&&&&&&&&&&&&&class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&&&&&&&&&&&name=&configLocation&&value=&classpath:hibernate.cfg.xml&&&&&&&&&&&&&name=&configurationClass&&value=&org.hibernate.cfg.AnnotationConfiguration&&&&&&&&&&&&&&&&&&&&&id=&transactionManager&&&&&&&&&&class=&org.springframework.orm.hibernate3.HibernateTransactionManager&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&&&&&id=&transactionBase&&&&&&&&&&&&&&&class=&org.springframework.transaction.interceptor.TransactionProxyFactoryBean&&&&&&&&&&&&&&&lazy-init=&true&&abstract=&true&&&&&&&&&&&&&&&&&&&&&&name=&transactionManager&&ref=&transactionManager&&&&&&&&&&&&&&&&&&&&&&&name=&transactionAttributes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&key=&*&PROPAGATION_REQUIRED&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&id=&userDaoTarget&&class=&com.bluesky.spring.dao.UserDaoImpl&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&&&&&id=&userDao&&parent=&transactionBase&&&&&&&&&&&&&name=&target&&ref=&userDaoTarget&&&&&&&&&&&
第三种方式:使用拦截器
&version=&1.0&&encoding=&UTF-8&&&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&&&&&&&&id=&sessionFactory&&&&&&&&&&&&&&&class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&&&&&&&&&&&name=&configLocation&&value=&classpath:hibernate.cfg.xml&&&&&&&&&&&&&name=&configurationClass&&value=&org.hibernate.cfg.AnnotationConfiguration&&&&&&&&&&&&&&&&&&&&&id=&transactionManager&&&&&&&&&&class=&org.springframework.orm.hibernate3.HibernateTransactionManager&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&&&&&id=&transactionInterceptor&&&&&&&&&&&class=&org.springframework.transaction.interceptor.TransactionInterceptor&&&&&&&&&&&&name=&transactionManager&&ref=&transactionManager&&&&&&&&&&&&&&&&&&&&&&&name=&transactionAttributes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&key=&*&PROPAGATION_REQUIRED&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&class=&org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator&&&&&&&&&&&&name=&beanNames&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*Dao&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&name=&interceptorNames&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&transactionInterceptor&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&id=&userDao&&class=&com.bluesky.spring.dao.UserDaoImpl&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&
第四种方式:使用tx标签配置的拦截器
&version=&1.0&&encoding=&UTF-8&&&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&&&&&&&&&&&&&&base-package=&com.bluesky&&&&&&&&&id=&sessionFactory&&&&&&&&&&&&&&&class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&&&&&&&&&&&name=&configLocation&&value=&classpath:hibernate.cfg.xml&&&&&&&&&&&&&name=&configurationClass&&value=&org.hibernate.cfg.AnnotationConfiguration&&&&&&&&&&&&&&&&&&&&&id=&transactionManager&&&&&&&&&&class=&org.springframework.orm.hibernate3.HibernateTransactionManager&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&&id=&txAdvice&&transaction-manager=&transactionManager&&&&&&&&&&&&&&&&&&&&&&&&name=&*&&propagation=&REQUIRED&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&id=&interceptorPointCuts&&&&&&&&&&&&&&expression=&execution(*&com.bluesky.spring.dao.*.*(..))&&&&&&&&&&&&advice-ref=&txAdvice&&&&&&&&&&&&&&pointcut-ref=&interceptorPointCuts&&&&&&&&&&&&&&&&&&&&&
第五种方式:全注解
&version=&1.0&&encoding=&UTF-8&&&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&&&&&&&&&&&&&&base-package=&com.bluesky&&&&&&&&&transaction-manager=&transactionManager&&&&&&&&id=&sessionFactory&&&&&&&&&&&&&&&class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&&&&&&&&&&&name=&configLocation&&value=&classpath:hibernate.cfg.xml&&&&&&&&&&&&&name=&configurationClass&&value=&org.hibernate.cfg.AnnotationConfiguration&&&&&&&&&&&&&&&&&&&&&id=&transactionManager&&&&&&&&&&class=&org.springframework.orm.hibernate3.HibernateTransactionManager&&&&&&&&&&&name=&sessionFactory&&ref=&sessionFactory&&&&&&&&&&&&&
此时在DAO上需加上@Transactional注解,如下:
package&com.dawnsky.spring.&&import&java.util.L&&import&org.hibernate.SessionF&import&org.springframework.beans.factory.annotation.A&import&org.springframework.orm.hibernate3.support.HibernateDaoS&import&org.springframework.stereotype.C&&import&com.bluesky.spring.domain.U&&@Transactional&@Component(&userDao&)&public&class&UserDaoImpl&extends&HibernateDaoSupport&implements&UserDao&{&&&&&&public&List&User&&listUsers()&{&&&&&&&&&return&this.getSession().createQuery(&from&User&).list();&&&&&}&}&
原文链接:http://dawn-sky.iteye.com/blog/1277270
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点关注头条头条关注
24H热文一周话题本月最赞
讲师:305377人学习过
讲师:132823人学习过
讲师:160385人学习过
精选博文论坛热帖下载排行
本书描述的是在逆向与反逆向之间展开的一场旷日持久的拉锯战。作者Eldad Eilam以一个解说人的身份为我们详尽地评述了双方使用的每一招每一...
订阅51CTO邮刊博客分类:
百度定义:
声明式事务:声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一。
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位。
首先来看看正确的完整配置:
Spring核心配置文件 applicationContext.xml
&!-- 声明事务 --&
&bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="dataSource" /&
&aop:config&
&aop:pointcut id="serviceOperation" expression="execution(* com.service.impl.*.*(..))" /&
&aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice" /&
&/aop:config&
&!--启动spring注解功能--&
&tx:annotation-driven transaction-manager="transactionManager" /&
&tx:advice id="txAdvice" transaction-manager="transactionManager"&
&tx:attributes&
&tx:method name="update*" propagation="REQUIRED"/&
&tx:method name="save*" propagation="REQUIRED"/&
&tx:method name="add*" propagation="REQUIRED"/&
&tx:method name="create*" propagation="REQUIRED"/&
&tx:method name="do*" propagation="REQUIRED"/&
&tx:method name="del*" propagation="REQUIRED"/&
&tx:method name="remove*" propagation="REQUIRED"/&
&tx:method name="get*" read-only="true" /&
&tx:method name="query*" read-only="true" /&
&tx:method name="find*" read-only="true" /&
&tx:method name="*"/&
&/tx:attributes&
&/tx:advice&
&context:component-scan base-package="com.test"&
&!--将Controller的注解排除掉 --&
&context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /&
&/context:component-scan&
SpringMVC配置文件 spring-servlet.xml
&!-- 注解模式 --&
&context:component-scan base-package="com.test" use-default-filters="false"&
&context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /&
&/context:component-scan&
Service层示例:(底层使用了Mybatis,在此篇不作详细介绍,具体请看下面相关URL。
TestServiceImpl.java
public class TestServiceImpl implements TestService{
private UserMapper userM
public void addUser() throws Exception{
User useri = new User();
useri.setUsername("222");
useri.setPassword("222");
this.userMapper.insert(useri);
throw new RuntimeException();//主动抛错,为了测试有没新增。若成功,则说明事务无效,若不能新增,则说明已回滚。
Controller测试类省略。经测试能回滚。
-------------------------------------
问题一:起始因为没有配置applicationContext.xml最后一个配置,导致事务失效,网上查了下原因,如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行。
因 为spring的context是父子容器,所以会产生冲突,Controller会先进行扫描装配,而此时的Service还没有进行事务的增强处理, 得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力) ,最后才是applicationContext.xml中的扫描配置进行事务处理。
mvc 的只扫描controller组件 注意使用 use-default-filters="false"
&context:component-scan base-package="com.fengzhiyin" use-default-filters="false" &
&context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/&
&/context:component-scan&
主体的扫描除controller外的所有组件
&context:component-scan base-package="com.fengzhiyin" &
&context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/&
&/context:component-scan&
补充:对于use-default-filters="false"的解释:
如果不设置use-default-filters="false",则Spring会扫描并优先注册默认的bean(当然包括标记为@Service的bean),这样,标记为@Transactional的service由于transaction manager尚未注册而未能生效,导致事务管理失效。
原理是:标记为@Transactional的service会wrap为经过transactional proxied(不管是CGLIB based或是JDK based)的bean,而不再是纯的service;
问题二:若要测试事务,有很多种方式,(只要测出会回滚就行),但千万别在Service里抛出一个Exception,来做为测试事务的方式。
规则如下:
默认遇到throw new RuntimeException("...");会回滚
需要捕获的throw new Exception("...");不会回滚
原因是抛出的Exception,在数据库层默认是“超时”错误。
当然这个可以通过类似@Transactional(rollbackFor=Exception.class)的来重新配置。
-----------------------------
参考资料:
zhumingpeng 写道楼主& 能把事务放倒 Controller 做吗能做,但不推荐。 为什么呢 求指点
楼主& 能把事务放倒 Controller 做吗能做,但不推荐。
angelbill3
浏览: 122714 次
来自: 杭州
太给力了,搞了一下午,一直换jar版本,不起作用,用楼主的方法 ...
楼主写的很精辟,言简意赅,非常实用
写的很精辟,很实用
找了好久,终于找到解决办法了,谢谢
&div class=&quote_title ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
1、我先要给大家讲一个概念:spring 的多数据源事务,这是民间的说法。官方的说法是:spring 的分布式事务。明白了这个概念,问题就好解决了。
2、分布式事务的应用场景:工程中使用两个及以上数据库中,就要考虑使用分布式事务管理,否则事务不能回滚。
3、现有两种开源的第三方jar支持spring的分布式事务管理,它们分别是:jotm和Atomikos。通过google可以找到下载的链接,其中atomikos的下载需要先填写email信息,再登录email找到链接去下载。下载地址分别:
我使用的是jotm。
4、基于spring+ibatis的环境下配置jotm的方法很简单。只城要修改spring数据源的配置及事务的配置及可。以下是我的配置,供参考。
&bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"&
&property name="defaultTimeout" value="500000"/&
&bean id="dataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"&
&property name="dataSource"&
&bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"&
&property name="transactionManager" ref="jotm"/&
&property name="driverName" value="${driverClass}"/&
&property name="url" value="${jdbcUrl}"/&
&/property&
&property name="user" value="${user}"/&
&property name="password" value="${password}"/&
&bean id="dataSourceBbs" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"&
&property name="dataSource"&
&bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"&
&property name="transactionManager" ref="jotm"/&
&property name="driverName" value="${bbs.driverClass}"/&
&property name="url" value="${bbs.jdbcUrl}"/&
&/property&
&property name="user" value="${bbs.user}"/&
&property name="password" value="${bbs.password}"/&
&!-- JTA事务管理器 --&
&bean id="myJtaManager" class="org.springframework.transaction.jta.JtaTransactionManager"&
&property name="userTransaction" ref="jotm" /&
&!-- 事务切面配置 --&
&aop:config&
&aop:pointcut id="serviceOperation" expression="execution(* com.bohai.service.impl.*.*(..))"/&
&aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"
order="0" /&
&/aop:config&
&!-- 通知配置 --&
&tx:advice id="txAdvice" transaction-manager="myJtaManager"&
&tx:attributes&
&tx:method name="delete*" propagation="REQUIRED"
&tx:method name="save*" propagation="REQUIRED"
&tx:method name="update*" propagation="REQUIRED"
&tx:method name="*" propagation="REQUIRED"
&tx:method name="find*" propagation="SUPPORTS" read-only="true"/&
&tx:method name="get*" propagation="SUPPORTS" read-only="true"/&
&tx:method name="fetch*" propagation="SUPPORTS" read-only="true"/&
&tx:method name="*_noTrans" propagation="NOT_SUPPORTED"/&
&/tx:attributes&
&/tx:advice&
5、jtom 还需要一个配置文件 carol.properties ,内容是:
# do not use CAROL JNDI wrapper
carol.start.jndi=false
# do not start a name server
carol.start.ns=false
# Naming Factory
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming
文件放在classpath下面,也就是src下面。
6、需要jtom的以下jar:
7、经过测试,配置是成功的。事务可以回滚。
浏览 17995
什么样的场景比较合适使用 多数据源 呢?
具体是个什么场景? 我们现在项目很大, 有快2000个表了, 但是数据源依然是一个.. 并发压力也较大.. 可以把2000个分别放到不同的数据库中,这样减轻了数据库的压力。当在工程中要使用多个数据库时,就要使用多数据源。
浏览: 374621 次
来自: 武汉
分布式事务解决方案的效果演示(结合支付系统真实应用场景):ht ...
bo_hai 写道movies.dat 数据中有一条无效的数据 ...
movies.dat 数据中有一条无效的数据,在267行。不删 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 tcc事务框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信