来自:http://www.blogjava.net/luoqx/archive/2006/01/11/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来保存数据连接和事务状态。原来如此,代码里的各个层没有特殊需要都不用再出现事务了,程序开发人员只要关注业务就可以了,不用再劳心编写事务代码了。
分享到:
相关推荐
接下来,Druid是一个优秀的数据库连接池,它提供了监控、SQL解析等功能,对于JTA事务的支持也相当完善。在配置Druid时,我们需要启用其支持JTA的特性,确保在分布式事务中能够正确地管理和恢复连接。 Mybatis则是一...
5. **配置Spring事务管理器**:创建Atomikos事务管理器的bean,并配置Spring的PlatformTransactionManager,指定使用Atomikos的UserTransaction。 6. **代码实现**:在业务逻辑中,通过Spring的@Transactional注解...
本篇文章将详细解析Spring中的事务类型,帮助你更好地理解和应用这些知识。 首先,Spring支持两种事务管理方式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**: 编程式事务管理通过在代码中直接调用`...
本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...
AtomikosDataSource支持JTA事务,这意味着我们可以在同一个事务中操作多个数据源。Spring的`@Transactional`注解可以用来开启和管理这些分布式事务,确保事务的ACID特性。 7. **代码示例** 创建多数据源的配置...
### Spring3配置声明式事务详解 #### 一、Spring3中的声明式事务简介 ...此外,Spring3还支持多种数据库事务管理技术如JTA、Hibernate等,使得开发人员可以根据实际需求选择合适的事务管理策略。
在Spring的jar包解析中,我们可以深入了解Spring框架的组成部分及其功能。 1. **spring.jar** - 这是Spring的主jar包,包含了所有模块的基本功能,但不包括特定于某些技术的库,如mock、aspects、portlet和...
在提供的XML配置示例中,我们可以看到Spring框架是如何配置两个不同的数据源,并为它们设置JTA事务管理器的。 ##### 数据源配置 首先,我们来看数据源的配置部分: ```xml <value>200 <value>70...
通过在部署描述符中声明JTA事务管理器,Hibernate会自动参与到JTA事务中,确保了在分布式环境下的数据一致性。例如,在Spring框架中,可以使用`@Transactional`注解,配合JTA实现声明式事务管理。 总的来说,`...
在本篇文章中,我们将深入探讨如何利用Spring框架结合JOTM(Java Open Transaction Manager)来实现多数据源下的分布式事务管理。我们将通过具体实例展示如何在Tomcat服务器环境下配置并使用这些技术。 #### 一、...
接着,如果提供了数据源(`dataSource`)、JTA事务管理器(`jtaTransactionManager`)或自定义的LobHandler,它们会被设置到线程局部变量中。这样做是为了在后续的SessionFactory配置过程中,这些资源能与当前线程绑定,...
本篇文章将深入解析Spring事务的方方面面,帮助你全面理解这个强大的特性。 首先,我们要明白什么是事务。事务是数据库操作的基本单位,它保证了一组数据库操作要么全部成功,要么全部失败,从而维护数据的一致性。...
至于AtomikosJtaTx,这可能是Atomikos的JTA事务管理相关的配置或实现文件。这些文件通常包含了Atomikos的配置信息,如数据源的JNDI名称、事务超时设置等。在项目中,我们需要根据实际需求调整这些配置,确保Atomikos...
本文将详细解析Spring事务配置的多种方法,包括XML配置和注解方式。 首先,理解Spring事务配置的基本组件至关重要。这些组件主要包括: 1. **DataSource**:数据源,它是连接数据库的桥梁,负责管理与数据库的连接...
由于提供的【部分内容】中仅含有重复的网址,并无有效文本内容,因此我将直接针对《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这一标题和描述进行知识点的生成。 Spring是一个流行的开源Java平台,它...
#### 六、Spring事务管理 Spring框架提供了强大的事务管理机制,可以在不侵入业务逻辑的情况下实现事务控制。 - **声明式事务**:通过配置元数据(XML或注解)来管理事务边界。 - **编程式事务**:通过编程的方式...
本节将深入探讨Spring事务的源码解析,特别是涉及的事务概念、三大核心接口以及相关属性。 1. **事务概念解析** 事务是数据库操作的基本单位,它封装了一组数据库操作,遵循ACID(原子性、一致性、隔离性和持久性...
本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...
`JotmFactoryBean`就与Spring的事务管理密切相关,它是Java Transaction API (JTA) 的一个实现,JTA是Java平台用于管理分布式事务的标准接口。 `org.springframework.transaction.jta.JotmFactoryBean`是一个Spring...
【Spring声明式事务解析】 Spring声明式事务是Spring框架中的一种事务管理方式,它允许开发者在不编写任何事务管理代码的情况下,通过配置来控制事务的边界。这种方式极大地简化了事务管理,使得业务逻辑代码和事务...