`

Spring 多数据源声明式事务控制(PlatformTransactionManager )

阅读更多
 
首先是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事务管理4种方式

    Spring事务管理4种方式 入门级 最简单demo PlatformTransactionManager TransactionTemplate

    Spring 2.0 开发参考手册

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    Spring中文帮助文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring API

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    spring chm文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...

    基于java的企业级应用开发:Spring事务管理概述.ppt

    在该JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus,如下图所示: Spring事务管理的三个核心接口 5.1.1 事务管理的核心接口 1....

    Spring.html

    声明式事务管理 PlatFormTransactionManager:平台事务管理器:定义了commit/rollback Mybatis/jdbc:DataSourceTransactionManager Hibernater:HibernaterTransactionManager TransactionManagerDifinition ...

    JAVA(Spring)事务管理.doc

    Spring事务管理高层抽象主要包括3个接口: 1.PlatformTransactionManager//事务管理器 真正用来管理事务的接口,包含事务提交和回滚等信息; Spring为不同的持久层框架提供不同的PlatformTransactionManager接口实现...

    spring_day04

    PlatformTransactionManager接口(平台事务管理器接口),不管使用哪种方式管理事务,这个类必须配置的!!

    Spring笔记说明文件

    1)、事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解 2)、事务拦截器: TransactionInterceptor;保存了事务属性信息,事务管理器; 他是一个 MethodInterceptor; 在目标...

    spring中事物管理1

    3.1平台事务管理器PlatformTransactionManager主要定义了各个不同的数据库平台的一些接口,针对不同的数据库平台进行事务管理org.spr

    spring 自动装配和aop的使用

    主要介绍了spring 自动装配和aop的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    SPRING API 2.0.CHM

    PlatformTransactionManager PluggableSchemaResolver Pointcut PointcutAdvisor PointcutComponentDefinition PointcutEntry Pointcuts PoolingConfig PortletApplicationContextUtils ...

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    spring-framework-reference4.1.4

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    分布式事务1

    事务功能的总体接口设计先来看下三大接口PlatformTransactionManager : 事务管理器TransactionDefinition : 事务的

    dbqueue:Java中基于数据库的队列抽象

    DbQueue 与 Spring 紧密耦合,特别是它可以利用 Spring 的PlatformTransactionManager抽象。 使用 DbQueue 如下: 根据给定的liquibase.xml文件创建QueueMessage表 在应用程序的 Spring 上下文中注册一个...

Global site tag (gtag.js) - Google Analytics