事务 ( acid )
atomic : 原子性 ,有多个行为组成的一组工作单元,这组操作要么都发生,要么都不发
生。
consistent : 一致性 , 事务结束之后(不管成功或者失败 ) 系统所处的状态和他的业务规
则应当是一致的
isolated : 隔离性,不同的事务之间不能相互干扰,这通常要以为着对数据库加锁
duration : 持久性,一旦事务提交,事务的结果就会持久保存,无论什么样的系统崩溃,
他们都将幸免遇难 。
Spring的事物支持
Spring 提供了对程序控制事务的支持,同时也支持声明式事务,Spring 采取了一种回调机制,将事务的控制从应用中抽取出来。选择程序控制或者声明式事务取决于事务控制的粒度。
Spring的TransactionManager
针对不同的事务实现,Spring提供了不同的事务管理工具 。
JDBC : org.springframework.jdbc.datasource.DataSourceTransactionManager
Hibernate: org.springframework.orm.hibernate.HibernateTransactionManager .
** 每种管理器都充当了针对特定平台的事务实现代理 。
在Spring中通过程序控制事务 :
编程式事物主要依靠TransactionTemplate接口来完成。
TransactionTemplate.execute();
1)声明事物管理器( transaction manager ) : 提供基本的事物服务。
2)声明事物模板( TransactionTemplate) ,并向TransactionTemplate中注入事物管理器
3) 向业务组件中注入TransactionTemplate。
4)在业务组件中通过TransactionTemplate的execute方法来进行事物控制。
1) 声明事务管理器, 在事务管理器中注入DataSource 或SessionFactory , 这取决于事务管理器的类型:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
2) 声明事务模板类 , 为事务模板类注入事务管理器 :
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
在事物模板类( TransactionTemplate )中定义了一个方法 :
template.execute( TransationCallBack callBack ) ;
需要运行在事务中的代码因该编写在 TransactionCallBack中 。在这个模型里我们可以这样理解几种组件之间的关系 :
TransactionManager : 提供基本的事务服务 :通过TransactionManager,完成对事物的
提交或会滚 。
transactionTemplate : 为需要事务服务的方法添加事务处理功能。具体的事务操作会调
用transactionManager完成 。
TransactionCallBack ; 提供运行在事务中的代码,TransactionCallBack提供的代码会被
Template加上事务环境 。
3) 编写事务模板所需要的回调接口 TransactionCallBack , 该接口通常以匿名内部类的方式实现。
public interface TransactionCallBack{
Object doInTransaction( TransactionStatus ts ) ;
}
将需要放在事务中的代码写在doInTransaction方法中 。
public class AdminService{
private TransactionTemplate transactionTemplate = null ;
private AdminDao dao = null ;
....... ;
public void createAdmins(final List<Admin> admins){
transactionTemplate.execute( new TransactionCallback(){
public Object doInTransaction( TransactionStatus ts ){
try{
for( Admin a : admins){
dao.insert( a );
}catch( Exception e){
ts.setRollbackOnly() ;
}
return null ;
}});
}
}
** dao 和 transactionTemplate 是通过依赖注入 到AdminService方法中的。
声明式事务 :
在Spring中使用声明式事务我们需要使用TransactionProxyFactoryBean .这个Bean的作用是为目标对象生成代理,在生成的代理中,会将目标的方法包装在事务上下文中 。
<bean id="adminService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>package.AdminService</value>
</list>
</property>
<property name="target">
<ref bean="xxxx"/>
</property>
<property name="transactionManager">
<bean ref=""/>
</property>
<!-- 事务属性 -->
<property name="transactionAttributeResource">
<bean ref=""/>
</property>
</bean>
事物属性
所谓事务属性,是对事务策略如何应用到方法中的描述 。这些描述包括这样一些属性
* 传播行为
* 只读提示
* 隔离级别
* 事务超时间隔
声明简单的事务策略 :
TransactionProxyFactoryBean 有一个transactionAttributeSource 属性,这个属性就是
用于指定事务策略的 。该接口定义如下 :
public interface TransactionAttributeSource{
TransactionAttribute getTransactionAttribute( Method , targetClass);
}
getTransactionAttribute方法根据目标类和方法获得事务属性 。
在spring为此接口提供了一个默认实现, MatchAlwaysTransactionAttributeSource
该接口在配置文件中的配置如下 :
<bean id="transactionAttributeSource" class="org.springframework.transaction
.interceptor.MatchAlwaysTransactionAttributeSource"
</bean>
在指定该策略时,我们没有指定采用什么样的事物策略,也没有指定哪个类的那个方法需要使用这个策略,因为MatchAlwaysTransactionAttributeSource 总是返回相同的事务策略而不管这个事务中包含了哪些方法。
默认的事物属性是 (PROPAGATION_REQUIRED | ISOLATION_DEFAULT)
:
替换默认的事物策略
为MatchAlwaysTransactionAttributeSource注入DefaultTransactionAttribute,
在DefaultTransactionActtibute中,制定我们需要的事物属性。
<bean id="defaultTransactionAttribute" class="org.springframework.transaction.interceptor.
DefualtTransactionAttribute">
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRED_NEW</value>
</property>
<property name="isolationLevelName">
<value>ISOLATION_READ_COMMITED</value>
</property>
</bean>
为MatchAlwaysTransactionAttributeSource 注入自定义的事务属性 :
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor
.MatchAlwaysTransactionAttributeSource">
<property name="transactionAttribute">
<ref bean="defaultTransactionAttribute"/>
</property>
</bean>
为不同的方法指定不同的事物策略
MatchAlwaysTransactionAttributeSource 对每一个方法均采用相同的事务属性,这对于
简单应用时十分方便的 , 但是如果在不同方法需要采用不同事务属性的情况下,这种方式
就不适用 了,我们可以通过另外一种TransactionAttributeSource来为每一个方法声明事务
属性 。
<bean id="transactionAttributeSource"
class="org.springframework.transction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="methodName">
PROPAGATION_REQUIRED_NEW,ISOLATION_READ_COMMITED
</prop>
</props>
</property>
</bean>
在指定方法名称时,可以使用通配符简化声明方式 :
<property name="properties">
<props>
<prop key="delete*">
PROPAGATION_REQUIRED_NEW,ISOLATION_READ_COMMITED
</prop>
</props>
</property>
指定事务回滚策略 :
当事务执行的过程中出现异常时,事务可以被声明为回滚或者不回滚,默认规则是RutimeException事务回滚,CheckedException 事务不会滚,但是可以通过配置改变策略。
<bean id="transactionAttributeSource"
class="org.springframework.transaction.interceptor.NameMathTransactionAttributeSource">
<property name="properties">
<props>
<prop name="methodname">
PROPAGATION_REQUIRED,-DAOException
</prop>
</props>
</property>
</bean>
DAOExcepton前面使用+ 或 - 修饰
+ 表示异常发生时提交事务。
- 表示异常发生时会滚事务。
名称匹配事务的捷径 :
以前我们是通过为TransactionProxyFactoryBean 注入TransactionAttributeSource来指定
事务属性,还用另外一种更加简便的方法来指定事务属性,在这种方式中,不需要定义单独的TransactionAttributeSource
<bean id="adminService"
class="org.springframework.transaction.interceptor.TransactionFactoryBean">
<property name="transactionProperties">
<props>
<prop key="mehtodName">
PROPOAGATION_REQUIRED,ISOLATION_READ_COMMITED
</prop>
</props>
</property>
</bean>
实现声明式事务的一般步骤
1)编写目标对象,即要运行在事物中的对象,通常为业务接口的实现类
2) 根据持久化技术的不同,声明transactionManager.
3) 为目标对象声明代理 ( TrnasactionProxyFactoryBean )并为其注入以下属性
a, proxyInterfaces
b,target
c,transactionManager
d, transacitonAttribute 或者 transactionProperteis.
1) 声明目标对象
<bean id="adminServiceTarget" class="xxxx.AdminServiceImpl">
<property name="adminDao">
<ref bean=""/>
</property>
</bean>
2) 声明事务管理器
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="xxxx"/>
</property>
</bean>
3) 声明TransactionAttributeSource来指定事务属性,有两种常用事务属性实现可以采用
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.
MatchAlwaysTransactionAttributeSource">
<property name="properties">
<props>
<prop key="mehtodName">
xxxxxxxxxxxxxxxx ;
</prop>
</props>
</property>
</bean>
4) 通过TransactionProxFactoryBean 将事务控制织入到目标对象的代理中 。
<bean id="adminService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>xxx.AdminService</value>
</list>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="target">
<ref bane="adminServiceTarget"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
事务属性 :
transactionAttributeSource :
|- MatchAlwaysTransactionAttributeResource :
| 不管什么方法,什么类型总是返回相同的事务属性 , 对于简单
| 应用非常方便,但是对于不同的方法,需要采用不同的事物属性
| 时就不适用了。
|- NameMatchTransactionAttributeResource :
可以根据不同的方法名称,指定不同的事务属性
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/uptorun/archive/2008/09/14/2835197.aspx
分享到:
相关推荐
这个名为"springTransaction.rar"的压缩包文件包含了一个关于Spring事务管理的小型示例,旨在演示如何使用Spring的事务传播机制来处理数据库操作,特别是转账功能的实现。 首先,让我们了解一下什么是事务。在...
在实际项目中,`springtransaction`工程可能是包含了一个完整的示例,用于演示如何在MyEclipse环境中配置和使用Spring的事务管理功能。开发者可以通过导入此工程,学习和实践Spring事务管理的配置与使用,从而更好地...
"spring-transaction.jar"正是提供了Spring事务管理的类库,它包含了一系列用于处理事务的接口、类和配置元素,使得开发者能够方便地实现事务控制。 一、Spring 事务管理概述 Spring事务管理分为编程式事务管理和...
本篇主要聚焦于"Spring 常用 Transaction Annotation",即声明式事务管理,这是一种更简洁、易于维护的事务控制方式。 首先,Spring的声明式事务管理基于AOP(面向切面编程),它允许我们在不修改业务代码的情况下...
12. Spring Transaction Management 13. Spring Batch 14. Spring NoSQL and Big Data 15. Spring Java Enterprise Services and Remoting Technologies 16. Spring Messaging 17. Spring Integration 18. Spring ...
使用 Spring Transaction 支持的简单 Spring MVC 应用程序,带有 @Transactional 注释和 JPA。 配置为与 Weblogic 事务管理器集成。 此示例应用程序仅用作配置了 Spring Transaction 支持的 Spring MVC 应用程序的...
org.springframework.transaction-3.2.2.RELEASE最新版本
### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...
6. **Spring Transaction**:事务管理模块提供了声明式和编程式的事务管理,确保了在分布式环境下的数据一致性。 7. **Spring Aspects**:此模块提供了AOP的扩展,支持自定义切面和通知类型,增强了Spring的面向切...
在Java企业级应用开发中,Spring框架以其强大的功能和灵活性被广泛应用,特别是在事务管理方面。Spring提供了全面的事务管理解决方案,使得开发者可以方便地控制事务的边界,保证数据的一致性和完整性。本篇将深入...
7. **Spring Transaction**: 提供了一致的事务管理接口,支持编程式和声明式事务管理。这使得事务管理可以跨不同的数据访问技术进行。 8. **Spring MVC**: 是Spring提供的用于构建Web应用的模型-视图-控制器(Model...
SpringTransaction是Spring框架的事务管理模块,它提供了一种声明式和编程式的事务管理方式。声明式事务管理允许我们在配置文件中定义事务边界,而无需在代码中显式控制事务开始和结束。编程式事务管理则通过...
6. **Spring Transaction**:提供了一种声明式和编程式事务管理机制,可以在多个数据库操作之间确保数据的一致性。 7. **Spring Web**:针对Web开发的模块,包含Spring MVC(Model-View-Controller)和Spring ...
3. **Spring Transaction** (spring-tx-4.1.6.RELEASE.jar): 事务管理是Spring的核心功能之一,它允许开发者声明性地管理事务,提供编程式和声明式的事务处理,支持多种事务API如JTA、JDBC、Hibernate等。...
- **功能简介**:包含了 Spring DAO、Spring Transaction 进行数据访问的所有类。 - **应用场景**:适用于需要进行数据访问操作的项目。 - **依赖关系**:依赖于 `spring-core.jar`、`spring-beans.jar`、`spring-...
- Spring Data JPA可以无缝地与Spring Boot、Spring MVC、Spring Transaction管理等组件集成,为开发者提供了完整的解决方案,降低了系统的复杂性。 然而,尽管Spring Data JPA带来了诸多便利,但在实际使用中也会...
7. **Spring Transaction**:提供了统一的事务管理接口,无论是本地事务还是分布式事务,都能进行统一的管理和控制。`@Transactional`注解使得事务管理变得简单。 8. **Spring Aspects**:提供了AOP的实现,包括...
Spring Transaction Management 事务管理是保证数据一致性的重要手段,Spring 提供了全面的事务管理功能,可以方便地应用于不同的业务场景中。 #### 12. Spring Batch 对于需要处理大量数据的任务,Spring Batch...
在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...
6. **Integration with Spring Transaction Management**:Spring Data JPA与Spring的事务管理无缝集成,可以方便地进行事务控制。 在实际使用中,我们需要配置Spring Data JPA,这通常涉及到以下步骤: 1. 添加...