`
- 浏览:
322673 次
- 来自:
...
-
spring本地事务与JTA事务实现解析 - zt
http://www.blogjava.net/luoqx/articles/16451.html
大家都知道spring支持两种事务,一种是本地连接事务(使用DataSourceTransactionManager),一种是JTA事务(使用JtaTransactionManager)。并且支持声明式事务和编程式事务两种方式。采用声明式事务使用AOP方式的TransactionProxyFactoryBean代理工厂类。
JTA事务实现相对较好理解,在执行实际类的符合模式的方法时,代理类通过在连接点前后插入预处理过程(开始事务)和后处理过程(commit或rollbak)即可。因为JTA事务支持两阶段提交所以在代码中启动多少个连接(不同的connection)都能保证事务最终提交或者回滚。可是本地连接事务是如何实现的呢?因为必须后面的dao层必须使用的同一个连接才能保证事务正常提交和回滚,在业务逻辑层可以调用dao层的多个类的多个方法,每个方法如果显式的将connection做为参数传入到还可以,但是这样connection就要出现调用的在业务逻辑层,而且dao的每个方法还要有个connection参数比较难看,而且开发人员要关注事务,这样就没有达到开发人员只要关注业务逻辑即可的要求。
web应用,各个类都要在多线程环境下运行,所以每个方法要保证线程安全,这样,不在dao方法中加参数而是在dao类中加入connection属性也就不可取了,怎么办?查看一下JdbcTemplate类,在执行每个方法需要数据库连接时都使用了DataSourceUtils.getConnection(getDataSource())方法?难道每回都从数据源里面取一条连接?不可能,这样事务肯定没法实现,可是怎么能保证取的是一条连接呢?对了是不是采用本地线程呀(TreadLocal),因为一段事务都是在一个线程中完成,所以只要在事务开始的时候将connection存放在本地线程中,然后事务过程中从本地线程中取出connection,直到事务结束即可。不错,这样只需要在每个dao方法的取数据库连接的方法中有个事务状态的判断即可。不错看看spring是不是这样实现的?果然如此,DataSourceUtils.getConnection(DataSource)方法调用doGetConnection()方法,方法内容如下:
public static Connection doGetConnection(DataSource dataSource) throws SQLException {
Assert.notNull(dataSource, "No DataSource specified");
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (conHolder != null) {
conHolder.requested();
return conHolder.getConnection();
}
logger.debug("Fetching JDBC Connection from DataSource");
Connection con = dataSource.getConnection();
if (TransactionSynchronizationManager.isSynchronizationActive()) {
logger.debug("Registering transaction synchronization for JDBC Connection");
// Use same Connection for further JDBC actions within the transaction.
// Thread-bound object will get removed by synchronization at transaction completion.
conHolder = new ConnectionHolder(con);
conHolder.setSynchronizedWithTransaction(true);
conHolder.requested();
TransactionSynchronizationManager.registerSynchronization(
new ConnectionSynchronization(conHolder, dataSource));
TransactionSynchronizationManager.bindResource(dataSource, conHolder);
}
return con;
}
conHolder?TransactionSynchronizationManager?很象呀,继续看看TransactionSynchronizationManager类果真如此,里面使用TreadLocal来保存数据连接和事务状态。原来如此,代码里的各个层没有特殊需要都不用再出现事务了,程序开发人员只要关注业务就可以了,不用再劳心编写事务代码了。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
例如,在Spring框架中,可以使用`@Transactional`注解,配合JTA实现声明式事务管理。 总的来说,`geronimo-jta_1.1_spec-1.1.1.jar`作为JTA规范的实现,对于那些依赖于Java EE服务,特别是需要进行复杂事务处理的...
本项目"spring-jta-mybatis"着重讲解了如何在Spring框架中结合JTA(Java Transaction API)和MyBatis实现分布式事务管理。 首先,分布式数据源是在多数据库环境下的一个重要概念。当业务需求扩大,单一数据库无法...
《深入理解geronimo-jta_1.1_spec-1.1.1.jar:源码解析与在Hibernate框架中的应用》 在Java开发领域,尤其是企业级应用开发中,JTA(Java Transaction API)扮演着至关重要的角色。Geronimo-JTA_1.1_spec-1.1.1.jar...
赠送jar包:geronimo-jta_1.1_spec-1.1.1.jar; 赠送原API文档:geronimo-jta_1.1_spec-1.1.1-javadoc.jar; 赠送源代码:geronimo-jta_1.1_spec-1.1.1-sources.jar; 赠送Maven依赖信息文件:geronimo-jta_1.1_spec...
Atomikos 是一个开源的JTA实现,它为Spring提供了一个轻量级、高性能的分布式事务解决方案。本文将深入探讨如何使用Spring、JTA和Atomikos来实现分布式事务。 首先,了解JTA的基本概念。JTA定义了一套规范,允许在...
Geronimo JTA 1.1规范是Java Transaction API(JTA)的一个实现,它定义了在分布式环境中管理事务的标准接口。本篇文章将深入探讨Geronimo JTA 1.1规范的核心概念,并结合Hibernate ORM框架,阐述其在实际应用中的...
它允许开发者编写无感知具体事务实现的代码,从而提高代码的可移植性和可维护性。 Spring通过JTATransactionManager实现了对JTA的支持。配置JTA事务管理通常涉及以下几个步骤: 1. 引入依赖:确保你的项目包含了...
Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个...
本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...
Spring支持JTA(Java Transaction API),这是一个Java标准,用于定义应用程序与事务管理器之间的接口,使得在分布式环境中进行事务处理变得可能。 JOTM(Java Open Transaction Manager)是Java世界中的一个开源...
- **javax.transaction.xa.XAResource**:定义了与事务管理器交互的接口,资源管理器必须实现此接口以参与事务。 3. **文档内容解析** - **stylesheet.css**:文档样式表,用于美化HTML文档的显示效果。 - **...
geronimo-jta_1.1_spec-1.1.jar
本教程将详细讲解如何使用Spring Boot、Druid和Mybatis来实现JTA(Java Transaction API)分布式事务。这是一项高级技术,它允许在多数据库环境或者微服务架构中进行一致性的数据操作。 首先,让我们了解什么是JTA...
在这个"第二部分spring+hibernate+jta 分布式事务Demo"中,我们将深入探讨如何利用这些技术实现高效的分布式事务管理。 Atomikos是一个开源的JTA实现,它提供了一套完整的事务管理解决方案,包括事务协调器和服务,...
2. Bitronix:另一种JTA实现,也可以与Spring Boot集成,处理分布式事务。 要启用JTA事务管理,你需要: 1. 添加Atomikos或Bitronix的依赖。 2. 配置事务管理器:使用`@EnableTransactionManagement`开启事务管理...
"Jboss4.2.2+Spring2.5.6+Hibernate+JTA事务的实现"就是一个典型的例子,它涉及到四个关键的技术栈,即JBoss Application Server 4.2.2、Spring 2.5.6、Hibernate ORM以及Java Transaction API(JTA)。这些技术的...
在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...
本话题主要聚焦于如何在Spring框架中结合Java Transaction API (JTA) 和 MyBatis 实现分布式事务管理。下面我们将详细探讨相关知识点。 1. **分布式事务**:在分布式系统中,事务处理跨越多个资源或服务,例如...
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...