`
jusescn
  • 浏览: 125819 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring支持多事务

    博客分类:
  • ssh
阅读更多

没有测试过,以前代码记录

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionStatus;

@SuppressWarnings("unchecked")
public class MultiTransactionManager implements PlatformTransactionManager {

	private List transManagerList;

	public void commit(TransactionStatus ts) throws TransactionException {
		TmTsHolder tmts;
		List tmtsList = ((MultiTranscationObject) ts).tmtsList();
		for (Iterator iter = tmtsList.iterator(); iter.hasNext();) {
			tmts = (TmTsHolder) iter.next();
			if (tmts.transactionStatus.isRollbackOnly()) {
				rollback(ts);
				return;
			}
		}

		for (Iterator iter = tmtsList.iterator(); iter.hasNext();) {
			tmts = (TmTsHolder) iter.next();
			tmts.transactionManager.commit(tmts.transactionStatus);
		}
	}

	public TransactionStatus getTransaction(TransactionDefinition def)
			throws TransactionException {
		MultiTranscationObject mo = new MultiTranscationObject();
		for (Iterator it = this.transManagerList.iterator(); it.hasNext();) {
			PlatformTransactionManager tm = (PlatformTransactionManager) it.next();
			mo.addTranscationObject(tm, tm.getTransaction(def));
		}
		return mo;
	}

	public void rollback(TransactionStatus ts) throws TransactionException {
		List tmtsList = ((MultiTranscationObject) ts).tmtsList();
		for (Iterator iter = tmtsList.iterator(); iter.hasNext();) {
			TmTsHolder tmts = (TmTsHolder) iter.next();
			tmts.transactionManager.rollback(tmts.transactionStatus);
		}
	}

	public void setTransManagerList(List transManagerList) {
		this.transManagerList = transManagerList;
	}

	private static class TsSpHolder {
		Object savePoint;
		TransactionStatus transactionStatus;

		TsSpHolder(TransactionStatus ts, Object savePoint) {
			this.transactionStatus = ts;
			this.savePoint = savePoint;
		}
	}

	private static class TmTsHolder {
		PlatformTransactionManager transactionManager;
		TransactionStatus transactionStatus;

		TmTsHolder(PlatformTransactionManager tm, TransactionStatus ts) {
			this.transactionManager = tm;
			this.transactionStatus = ts;
		}
	}

	private static class MultiTranscationObject implements TransactionStatus {
		private boolean rollbackOnly;
		private List tmtsList;

		private MultiTranscationObject() {
			this.rollbackOnly = false;

			this.tmtsList = new ArrayList();
		}

		void addTranscationObject(PlatformTransactionManager tm,
				TransactionStatus ts) {
			this.tmtsList.add(new MultiTransactionManager.TmTsHolder(tm, ts));
		}

		public Object createSavepoint() throws TransactionException {
			List tsspList = new ArrayList();
			for (Iterator it = this.tmtsList.iterator(); it.hasNext();) {
				TransactionStatus ts = ((MultiTransactionManager.TmTsHolder) it
						.next()).transactionStatus;
				tsspList.add(new MultiTransactionManager.TsSpHolder(ts, ts
						.createSavepoint()));
			}

			return tsspList;
		}

		public boolean isNewTransaction() {
			for (Iterator it = this.tmtsList.iterator(); it.hasNext();) {
				TransactionStatus ts = (TransactionStatus) it.next();
				if (!(ts.isNewTransaction()))
					return false;

			}

			return true;
		}

		public boolean isCompleted() {
			return true;
		}

		public boolean hasSavepoint() {
			return true;
		}

		public boolean isRollbackOnly() {
			return this.rollbackOnly;
		}

		public void releaseSavepoint(Object savePoint)
				throws TransactionException {
			List tsspList = (List) savePoint;
			for (Iterator it = tsspList.iterator(); it.hasNext();) {
				MultiTransactionManager.TsSpHolder tssp = (MultiTransactionManager.TsSpHolder) it
						.next();
				tssp.transactionStatus.releaseSavepoint(tssp.savePoint);
			}
		}

		public void rollbackToSavepoint(Object savePoint)
				throws TransactionException {
			List tsspList = (List) savePoint;
			for (Iterator it = tsspList.iterator(); it.hasNext();) {
				MultiTransactionManager.TsSpHolder tssp = (MultiTransactionManager.TsSpHolder) it
						.next();
				tssp.transactionStatus.rollbackToSavepoint(tssp.savePoint);
			}
		}

		public void setRollbackOnly() {
			for (Iterator it = this.tmtsList.iterator(); it.hasNext();) {
				MultiTransactionManager.TmTsHolder tmts = (MultiTransactionManager.TmTsHolder) it
						.next();
				tmts.transactionStatus.setRollbackOnly();
			}
			this.rollbackOnly = true;
		}

		public List tmtsList() {
			return this.tmtsList;
		}
	}
}

 

分享到:
评论

相关推荐

    spring boot注解事务+多线程

    在Spring Boot应用中,事务管理和多线程是两个非常关键的特性,特别是在处理复杂的业务逻辑时。本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在...

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    《Spring Boot多数据源(支持Spring声明式事务切换和回滚)》 Spring Boot多数据源技术是构建高效、灵活的多租户SaaS架构的关键。在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论...

    Spring对事务支持

    这份文档以例子的形式讲诉了Spring对事务支持的知识,希望可以帮助学习的人!

    spring事务与数据库操作

    Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中声明式事务管理因其易于使用和维护而被广泛采用。 ##### 1.1 Spring声明式事务介绍 Spring的声明式事务管理是通过配置文件或注解的方式来实现...

    Spring事务管理Demo

    - `SUPPORTS`:如果当前存在事务,则支持事务;如果没有事务,则不开启。 - `MANDATORY`:如果当前存在事务,则加入;如果没有事务,则抛出异常。 - `REQUIRES_NEW`:总是新建一个事务,如果当前存在事务,则暂停...

    Spring事务流程图

    4. **事务隔离**:Spring支持多种事务隔离级别,如READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE,不同的隔离级别能防止特定类型的并发问题。 5. **事务传播行为**:Spring提供了七种事务传播...

    实验 spring 声明事务

    在实际应用中,Spring 的声明式事务管理不仅限于JDBC,还支持其他数据访问技术,如Hibernate、MyBatis等。同时,Spring还提供了编程式事务管理,允许开发者在代码中手动管理事务,但这种方式通常在更复杂的场景或...

    Spring2.5实现事务管理(本地事务、分布式事务).doc

    Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个操作失败,则整个事务回滚,保证数据的一致性。 在 ...

    Spring事务与Java事务比较

    Spring 的事务管理提供了更高级别的抽象,可以跨越单一方法的边界,甚至跨多个服务调用进行事务管理。它支持多种事务传播行为(如 PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW 等),可以根据不同的业务场景...

    spring 简单实例 事务回滚

    它提供了丰富的功能,包括依赖注入、面向切面编程、数据访问、Web应用支持以及事务管理等。在这个“spring简单实例 事务回滚”的案例中,我们将深入探讨Spring如何处理事务回滚,以及它是如何在Java源码层面实现这一...

    spring-tx事务管理实例

    隔离级别是事务管理中的另一个核心概念,Spring支持数据库默认的五种隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。不同的隔离级别会带来不同的并发问题,如脏读、不可重复读和幻读...

    Spring 框架的事务管理及应用

    Spring框架提供了两种类型的事务管理支持:编程式事务管理和声明式事务管理。 **1. 编程式事务管理** 编程式事务管理允许开发者通过编程的方式显式地管理事务的开始、提交和回滚。这种方式相对灵活,但通常需要...

    spring3.0两种事务管理配置

    * PROPAGATION_NOT_SUPPORTED:不支持事务 * PROPAGATION_NEVER:不允许存在事务 Spring 3.0 的事务管理配置提供了两种方法:基于 XML 的事务管理和基于 @Transactional 的事务管理,这两种方法都可以实现事务管理...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么其实现原理一定很深奥吧?可是如果读者仔细研究了Spring事务管理的代码以后就会发现,事务管理其实也是如此简单的事情。这也...

    spring声明式事务管理配置方式

    - Spring支持多种事务管理器,如DataSourceTransactionManager(用于JDBC事务)和HibernateTransactionManager(用于Hibernate)。事务管理器是负责处理事务的核心组件,它根据配置决定如何开始、提交、回滚事务。 ...

    Spring事务小demo

    - **隔离级别**:Spring支持数据库事务的四种隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。这些隔离级别决定了并发环境中事务...

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    spring声明式事务配置

    这通常涉及到使用Spring AOP的支持,将事务管理作为切面应用到多个Bean上。这种方式可以减少配置的重复性,提高代码的复用率。 ### 总结 以上两种方式都是Spring框架中声明式事务管理的有效实现手段。第一种方式...

    Spring框架的事务管理应用分析.doc

    Spring支持基于注解的事务管理,例如在方法上添加`@Transactional`注解来指定事务行为。 **Spring事务管理的优势** - **统一的事务策略**:Spring事务管理支持JDBC、Hibernate、JPA等多种数据访问技术,提供了一致...

    Spring Hibernate事务实例

    例如,所有以"save"、"update"或"delete"开头的方法都要求必须在事务内执行,而其他方法默认支持事务,但不强制。 接下来,我们还需要创建一个Service层接口及其实现类,其中包含需要进行事务管理的业务逻辑。在...

Global site tag (gtag.js) - Google Analytics