- 浏览: 577540 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
首先是TransactionManager的配置:
<?xml version="1.0" encoding="gb2312"?> <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/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <bean id="db1Tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="db1" /> </property> </bean> <bean id="db2Tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="db2" /> </property> </bean> <bean id="dbcTx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dbc" /> </property> </bean> <bean id="routingTransactionManager" class="com.mysoft.manager.impl.RoutingTransactionManager"> <property name="targetTransactionManagers"> <map value-type="org.springframework.transaction.PlatformTransactionManager"> <entry key="db1" value-ref="db1Tx" /> <entry key="db2" value-ref="db2Tx" /> <entry key="dbc" value-ref="dbcTx" /> </map> </property> </bean> <!-- 配置事务回滚的场景 --> <tx:advice id="txAdvice" transaction-manager="routingTransactionManager"> <tx:attributes> <tx:method name="*" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> <!-- 指定那些类的哪些方法参与事务 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.mysoft.manager.Manager1.publish(..))"/> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.mysoft.manager.Manager2.audit(..))"/> </aop:config> </beans>这里用到了spring的tx和aop标签, 都是spring的参考手册中的典型配置. 当调用指定的packageName.method(..)方法的时候, 将采用事务拦截, 如果在对该方法的调用过程中出现了任何异常将导致事务回滚.
接下来就是路由的问题, 其中RoutingContextHolder类内部使用一个ThreadLocal类用来指定db1, db2, db3等key值, RoutingTransactionManager类则根据当前线程中的key值取得对应的tx.
/** * 用来存储路由到指定tx的Context * */ @SuppressWarnings("unchecked") public class RoutingContextHolder<T> { private static final ThreadLocal contextHolder = new ThreadLocal(); public static <T> void setContext(T context) { Validate.notNull(context, "必须指定路由的context"); contextHolder.set(context); } public static <T> T getContext() { return (T) contextHolder.get(); } }
/** * 根据给定的路由规则来路由到合适的tx类 * * @see RoutingContextHolder */ public class RoutingTransactionManager implements PlatformTransactionManager { private Map<Object, PlatformTransactionManager> targetTransactionManagers = new HashMap<Object, PlatformTransactionManager>(); /** * 根据给定的规则获取指定的tx * * @return */ protected PlatformTransactionManager getTargetTransactionManager() { Object context = RoutingContextHolder.getContext(); Validate.notNull(context, "必须指定路由的context"); return targetTransactionManagers.get(context); } public void setTargetTransactionManagers(Map<Object, PlatformTransactionManager> targetTransactionManagers) { this.targetTransactionManagers = targetTransactionManagers; } public void commit(TransactionStatus status) throws TransactionException { getTargetTransactionManager().commit(status); } public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { return getTargetTransactionManager().getTransaction(definition); } public void rollback(TransactionStatus status) throws TransactionException { getTargetTransactionManager().rollback(status); } }其调用代码如下:
// 指定tx的路由context RoutingContextHolder.setContext("db1"); return manager1.publish(item);
发表评论
-
Spring 动态数据源(AbstractRoutingDataSource )
2014-04-11 18:25 1663Spring动态配置多数据源,即在大型应用中对数据进行横向 ... -
(转)Spring Security 3.0 多页面登录配置
2012-10-19 17:01 5433网上很多文章是关于Spri ... -
Spring 中集成 JOTM 配置 JTA 事务
2011-12-27 19:52 1598Spring 中集成 JOTM 配置 JTA 事务: ... -
Spring 3.1整合EhCache
2011-08-29 16:42 1463Spring 3.1提供了对cache的 ... -
spring集成xfire教程
2011-04-02 15:20 1595配置web.xml <!-- SPRING ... -
关于Spring 声明式事务处理时,throws exception不回滚的问题
2010-09-29 23:31 9010前一段时间,项目代码评审,发现有TX不使用Spri ... -
iBatis SqlMap 的配置总结 收藏
2010-07-22 14:30 3756核心提示:SqlMap的配 ... -
ibatis oscache 使用中miss cache
2010-06-10 13:17 2891原始配置信息: <cacheModel id=&quo ... -
ibatis oscache配置以及【文件名、目录名或卷标语法不正确】错误解决
2010-05-26 13:13 3411sqlmap-config.xml 配置如下: < ... -
Hibernate+ehcache二级缓存技术
2010-02-01 20:57 9261、首先设置EhCache,建立配置文件ehcache.XML ... -
Hibernate的缓存讨论
2010-02-01 20:50 1119一般系统中有三种情况 ... -
OpenSessionInView Filter 但是发现不生效(转载)
2010-01-25 15:35 1794今天有一个朋友问了我一个问题,他使用的是Hibernate/S ... -
spring有三种启动方式,使用ContextLoaderServlet,ContextLoader
2010-01-19 17:25 1172spring有三种启动方式,使用ContextLoaderSe ... -
ApplicationContext和BeanFactory的关于单实例bean装载的区别
2010-01-19 17:04 1237Bean工厂延迟载入所有的Bean,直到getBean()方法 ... -
Spring AOP 学习小结(转载)
2010-01-06 21:24 1450一、AOP 概念 Joinpoint ... -
AOP术语(转载)
2010-01-06 21:04 1036AOP术语(转载) 2009-07-16 22:12 ... -
spring Lookup方法注入(转)---cglib解决子类过多问题、重构
2010-01-06 17:33 5931“Lookup方法”可以使Spri ... -
Spring JTA应用之Atomikos配置
2010-01-05 23:17 3759Atomikos,是一个基于Java的开源事务管理器,提供了事 ... -
多对多关系中Set的查询
2010-01-05 22:27 1098多对多关系中Set的查询 一个老师教多个学生,一个学生 ... -
ibatis 使用 in子句
2009-09-28 18:44 1879因为in的性能问题,平常不怎么用。今天特殊需求,在ibatis ...
相关推荐
在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过XML配置或注解来定义事务边界,而无需在业务逻辑代码中显式地调用开始、提交或回滚事务的方法。这篇博文"Spring使用XML配置...
在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...
总之,实现基于Spring的多数据源动态切换是一项复杂但必要的任务,它涉及到数据库连接管理、事务控制、AOP编程等多个方面。通过理解上述步骤和原理,开发者可以更好地设计和实施适用于各种业务场景的多数据源解决...
Spring框架的声明式事务处理是其企业级应用中的核心特性之一,它允许开发者通过配置来管理事务,而无需在代码中显式地控制事务的开始、提交和回滚。这种方式极大地提高了代码的可读性和可维护性。在这个"spring声明...
总之,Spring的声明式事务管理简化了事务处理,降低了代码的复杂性,而Hibernate的编程式事务管理则提供了更多的控制。在实际项目中,根据需求选择适合的事务管理方式,Spring和Hibernate的集成则为Java开发提供了...
声明式事务管理允许开发者通过配置来控制事务,无需在代码中显式处理事务开始、提交和回滚。 **Spring框架** 是一个全面的Java应用开发框架,它提供依赖注入(DI)、面向切面编程(AOP)以及各种企业服务,如事务...
编程式事务管理适合对事务有特殊需求或需要精细控制的场合,而声明式事务管理则更适合大部分常规情况,让代码更加整洁。在实际项目中,根据具体需求和团队习惯来选择合适的事务管理方式是非常重要的。
声明式事务管理是Spring框架提供的一种方便、高效的方式,使得开发者无需手动控制事务的开始、提交、回滚等过程,而是通过配置或注解来声明事务边界。这种方式极大地提高了代码的可读性和可维护性。 首先,要理解...
使用`PlatformTransactionManager`来处理多数据源的事务管理。需要为每个数据源创建一个事务管理器,并在`determineCurrentLookupKey()`返回的键值与之匹配。 ```java @Bean(name = "db1TransactionManager") ...
声明式事务管理是Spring提供的一种高级事务管理方式,它允许开发者在不直接编写事务控制代码的情况下,通过配置元数据(如XML或注解)来声明事务边界。这种方式极大地提高了代码的可维护性和降低了业务逻辑与事务...
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
本文主要探讨Spring声明式事务管理的配置,这是Spring提供的一种简便的事务管理方式,允许开发者在不编写任何事务管理代码的情况下实现事务控制。这种方式极大地提高了代码的可维护性和可读性。 首先,我们要理解...
3. 使用Spring的@TransactionManagement注解启用声明式事务管理。 4. 在服务层方法上添加@Transactional注解,指定需要参与事务的方法。 5. 在业务逻辑中,通过UserTransaction发起全局事务,然后在各数据源执行局部...
通过以上步骤,我们就成功地在Spring Boot应用中集成了MyBatisPlus,并使用Spring的声明式事务管理实现了事务控制。这使得我们在处理复杂业务逻辑时,可以专注于业务代码,而无需关心事务的开始和结束,大大提高了...
在单数据源的情况下,Spring的声明式事务管理可以方便地处理事务的开始、提交、回滚等操作。但在多数据源场景下,Spring默认的PlatformTransactionManager不再适用,需要借助外部事务管理器来处理跨数据源的事务。 ...
Spring声明式事务是Java开发中不可或缺的一部分,它利用Spring的AOP(面向切面编程)和代理机制,为开发者提供了一种简洁的方式来管理事务。在本文中,我们将深入探讨Spring声明式事务的工作原理,源码分析,以及...
在Spring框架中,声明式事务管理是其核心特性之一,它极大地简化了应用程序中的事务处理。Spring 2.x版本的声明式事务配置模板是开发者常用的一种方式,它通过AOP(面向切面编程)实现事务的自动管理,使得开发者...
在Spring Boot中,我们可以利用Spring的声明式事务管理以及Bitronix Transaction Manager(BTM)或Atomikos这样的开源JTA实现来处理多数据源事务。 1. **配置多数据源**: - 创建两个数据源配置,分别代表不同的...
要使用声明式事务,需要先搭建环境,包括导入相关依赖、配置数据源和 JdbcTemplate、给方法上标注 @Transactional、开启基于注解的事务管理功能、配置事务管理器等步骤。 1. 导入相关依赖:需要导入 Spring-jdbc ...
声明式事务管理通过配置元数据(如XML或注解)来控制事务边界,而编程式事务管理则通过TransactionTemplate或PlatformTransactionManager接口直接在代码中管理事务。 在描述中提到的博客文章中,作者可能详细讲解了...