来源:http://www.360doc.com/content/10/0906/22/3183606_51725538.shtml
Spring不会直接去管理事务,它提供了很多可供选择的事务管理器,将事务委托给JTA或某些特定的平台事务实现。常见的Spring事务管理器:
org.springframework.jdbc.datasource.DataSourceTransactionManager
提供JDBC事务支持,也可以用来支持iBatis
org.springframework.orm.hibernate.HibernateTransactionManager
Hibernate2持久事务支持
org.springframework.orm.hibernate.HibernateTransactionManager
Hibernate3持久事务支持
org.springframework.orm.jpa.JpaTransactionManager JPA持久事务支持
这些都是一些持久性事务,也是平时用的最多的(尤其是对我这种天天CRUD的人)
OK!知道了这一点我们便可以在Spring中编写事务,最常用的方法是使用TransactionTemplate,如果你用过Spring的JdbcTemplate的话就会觉的它跟这个用法很像。
首先我们需要声明一个Spring的事务管理器。我们知道,使用JdbcTemplate需要一个数据源,使用事务那么也需要一个声明一个事务管理器:
<bean id="transactionManager"
class="org.springframework.jdbc.datasoure.DataSoureTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
这是JDBC的事务管理器,它有一个dataSource属性,指向要操作的数据源.接下来我们要写一个用户注册的服务(我实在举不出什么好例子来了):
public class UserService {
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private UserDAO userDAO;
@Autowired
private MailSender sender;
public UserService(){
}
public void reg(final User user){
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus ts){
try{
userDAO.insert(user);
sender.send();
}
catch(Exception e){
ts.setRollbackOnly();
}
return null;
}
});
}
}
注册服务分为两个步骤,一个是将用户的信息插入到数据库,二是向用户发送邮件激活通知。这两个步骤是原子性的(好吧),因此需要使用事务支持,事务操作主要是通过
TransactionTemplate来实现的,我们需要在Spring配置文件中配置它:
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
属性transactionManager指向前面声明的JDBC事务管理器
我们只需要将事务代码放入到doInTransaction方法中即可,如果doIntransaction能够被成功执行到return,则事务将被提交,如果中途遇到问题,如Exception,则调用
setRollbackOnly()方法回滚整个事务
Spring对声明式事务的支持:
嗯~~上面这段代码不是很好,为啥?因为reg服务应该只去管用户注册这个事情,但是它现在却包含了很多事务处理的代码,违反了单一原则,这时候你可能会想到AOP,能不
能使用AOP来处理事务呢?嗯,开发Spring的大牛们当然会去想到这一点,他们为此提供了声明式事务的支持,这个支持也是通过Spring的AOP框架来实现的。
什么是声明式事务?就是通过配置文件和注解等方式来进行事务的声明,而不去侵犯程序代码,这样就不会违背单一职责原则了。
Spring中的声明式事务是使用参数来定义的,一个参数就是对事务策略应该如何应用到某个方法的一段描述,这些参数名字很长,比我的发型还恶心。
传播行为:传播行为定义了关于客户端和被调用方法的事务边界
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,
则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
隔离级别:隔离级别定义了事务受并发活动的影响程度
1. ISOLATION_DEFAULT:
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
除了防止脏读,不可重复读外,还避免了幻像读
关于脏读(Dirty read)、不可重复读(Nonrepeatable read)和幻读(Phantom reads)的介绍:
脏读:如果事务A读取了事务B改写但是尚未提交的数据,事务B发生了问题(来了大姨妈?)回滚了,那么A所读取的数据是无效的,这个故事叫做脏读
不可重复读:如果一个事务多次读取数据,每一次结果都不同,这是由于另一个事务在更改数据,这个故事叫做不可重复读
幻读:幻读跟不可重复读差不多,如果一个事务A读取了数据,事务B又插入了一些数据,在后来的查询中事务A发现了一些额外的记录
很简单?哈哈.看看在Spring中如何使用声明式事务:
Spring2.0开始为事务提供了配置元素
首先需要在Spring配置文件中添加AOP支持,因为Spring声明式事务是基于AOP的,然后在加入事务标签支持:
命名空间:
xmlns:tx="http://www.springframework.org/schema/tx"
Schema声明:
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
接下来我们只需要添加如下配置内容就可以使用声明式事务了:
<!- 这个就不详细说了,添加AOP支持 -->
<aop:config>
<aop:pointcut expression="execution(* *. .UserServicce.reg(..)"/>
<aop:advisor advice-ref="txAdvice"/>
</aop:config>
<!-- 重点是下面 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="reg" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<tx:advice>用来声明事务策略,同样需要指定一个事务管理器,这个是必须的,我们知道Spring不会自己去管理事务的,它一向喜欢代理,让人看起来好像一切都是它的功
劳,嗯!
<tx:attribute>声明了事务参数,<tx:method>是需要提供事务支持的方法,需要注意的是它有这么几个参数:
isolation:指定事务隔离级别
no-rollback-for:对于哪些异常不回滚(设计者咋就想的这么周到呢!?)
propagation:事务的传播级别
read-only:该事务只读
rollback-for:哪些异常发生之后回滚
timeout:定义事务超时
唉~~配置文件还是太恶心了,要是有注解~~嗯,还真有:
首先要添加一个注解驱动标签:<tx:annotation-driven transaction-manager="txManager"/>
然后我们使用@Transactional注解,这个注解可以修饰类也可以修饰方法,修饰类的话将作用于该类所有的方法,注解的参数同<tx:method>的参数,另外有一个很酷的地方
是如果UserService是一个接口,那么我给他使用了@Transactional()注解,那么它的一系列实现类UserServiceImpl1、UserServiceImpl2……UserServiceImpl10000都会自
动支持该声明事务
完!事务很重要!
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。
实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...
PlatformTransactionManager接口是Spring事务管理的核心,它负责事务的创建、提交和回滚。这个接口定义了以下三个基本操作: - `getTransaction(TransactionDefinition definition)`:根据传入的...
Spring 3.0 提供了两种事务管理配置方法:基于 XML 的事务管理和基于 @Transactional 的事务管理,这两种方法都是为了实现事务管理的目标,分别具有不同的配置方式和优缺点。 基于 XML 的事务管理 这种方法不需要...
在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供...如果你想要深入了解,可以参考提供的博客链接或其他相关资料,进一步学习Spring事务管理的细节和最佳实践。
本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring事务管理的核心是基于AOP(面向切面编程)来实现的。 **Spring事务的本质**实际上是依赖于底层数据库提供的事务支持。如果没有数据库层面的支持,Spring无法单独实现事务的功能。在传统的JDBC操作中,如果想...
Spring事务管理主要分为两种方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编写代码来控制事务的开始、提交、回滚等操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加直观和易于使用。 ...
Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...
在实际开发中,理解这部分源码有助于我们更深入地掌握Spring事务管理的工作原理。 至于工具,开发者可以使用诸如IntelliJ IDEA这样的IDE,其中集成的调试工具可以帮助我们跟踪代码执行流程,查看事务状态的变化,...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...
#### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...
Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个...
### Spring框架的事务管理及应用 #### Spring框架概述 Spring框架是一个开源项目,最早出现在2003年2月,其起源可以追溯到Rod Johnson在2002年末出版的书籍《Expert One-on-One J2EE Design and Development》中的...
### Spring事务管理详解 #### 一、事务管理基础概念 在深入探讨Spring事务管理之前,我们需要先理解什么是事务。事务可以被定义为一系列的操作集合,这些操作作为一个整体被提交或回滚。简单来说,事务就是一个不...
Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中声明式事务管理因其易于使用和维护而被广泛采用。 ##### 1.1 Spring声明式事务介绍 Spring的声明式事务管理是通过配置文件或注解的方式来实现...