一、背景
在上一篇Spring事务:事务属性和API简介中,初步地介绍了关于Spring事务的一些属性和主要的API,这一篇主要论述的是Spring事务中的编程史事务管理。
二、编程式事务管理
1、Spring的编程式事务管理概述
在Spring出现以前,编程式事务管理对基于POJO的应用来说是唯一选择。之前学习过Hibernate,这里面的事务管理是需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。通过Spring提供的事务管理API,我们可以在代码中灵活控制事务的执行。在底层,Spring仍然将事务操作委托给底层的持久化框架来执行。
2、基于底层API的编程式事务管理
根据PlatformTransactionManager、TransactionDefinition和TransactionStatus三个核心接口,我们完全可以通过编程的方式来进行事务管理。示例代码如下所示:
public class BankServiceImpl implements BankService {
private BankDao bankDao;
private TransactionDefinition txDefinition;
private PlatformTransactionManager txManager;
......
public boolean transfer(Long fromId, Long toId, double amount) {
TransactionStatus txStatus = txManager.getTransaction(txDefinition);
boolean result = false;
try {
result = bankDao.transfer(fromId, toId, amount);
txManager.commit(txStatus);
} catch (Exception e) {
result = false;
txManager.rollback(txStatus);
System.out.println("Transfer Error!");
}
return result;
}
}
相应的配置文件如下所示:
<bean id="bankService" class="footmark.spring.core.tx.programmatic.origin.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
<property name="txManager" ref="transactionManager"/>
<property name="txDefinition">
<bean class="org.springframework.transaction.support.DefaultTransactionDefinition">
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
</property>
</bean>
如上所示,我们在类中增加了两个属性:一个是TransactionDefinition类型的属性,它用于定义一个事务;另一个是PlatformTransactionManager类型的属性,用于执行事务管理操作。如果方法需要实施事务管理,我们首先需要在方法开始执行前启动一个事务,调用PlatformTransactionManager.getTransaction(...) 方法便可启动一个事务。创建并启动了事务之后,便可以开始编写业务逻辑代码,然后在适当的地方执行事务的提交或者回滚。
3、基于TransactionTemplate的编程式事务管理
通过前面的示例可以发现,这种事务管理方式很容易理解,但令人头疼的是,事务管理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且每一个业务方法都包含了类似的启动事务、提交/回滚事务的样板代码。Spring在数据访问层非常常见的模板回调模式,如下所示:
public class BankServiceImpl implements BankService {
private BankDao bankDao;
private TransactionTemplate transactionTemplate;
......
public boolean transfer(final Long fromId, final Long toId, final double amount) {
return (Boolean) transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus status) {
Object result;
try {
result = bankDao.transfer(fromId, toId, amount);
} catch (Exception e) {
status.setRollbackOnly();
result = false;
System.out.println("Transfer Error!");
}
return result;
}
});
}
}
相应的配置文件如下:
<bean id="bankService" class="footmark.spring.core.tx.programmatic.template.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
<property name="transactionTemplate" ref="transactionTemplate"/>
</bean>
TransactionTemplate的execute()方法有一个TransactionCallback类型的参数,该接口中定义了一个doInTransaction()方法,通常我们以匿名内部类的方式实现TransactionCallback接口,并在其doInTransaction()方法中书写业务逻辑代码。这里可以使用默认的事务提交和回滚规则,这样在业务代码中就不需要显式调用任何事务管理的API。doInTransaction()方法有一个TransactionStatus类型的参数,我们可以在方法的任何位置调用该参数的setRollbackOnly()方法将事务标识为回滚的,以执行事务回滚。
根据默认规则,如果在执行回调方法的过程中抛出了未检查异常,或者显式调用了TransacationStatus.setRollbackOnly()方法,则回滚事务;如果事务执行完成或者抛出了checked类型的异常,则提交事务。
TransactionCallback接口有一个子接口TransactionCallbackWithoutResult,该接口中定义了一个doInTransactionWithoutResult()方法,TransactionCallbackWithoutResult接口主要用于事务过程中不需要返回值的情况。当然,对于不需要返回值的情况,我们仍然可以使用TransactionCallback接口,并在方法中返回任意值即可。
三、总结
这篇主要介绍了Spring中的编程式的事务管理,下一篇主要介绍下Spring事务中的声明式事务管理,有兴趣的小伙伴可以继续阅读。
分享到:
相关推荐
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
Spring提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏...
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**:通过使用`PlatformTransactionManager`接口及其实现类(如`JdbcTemplate`或`HibernateTemplate`),开发者...
总结来说,`Spring_tx编程式事务代码`主要涉及Spring的`TransactionTemplate`类,它是Spring事务管理的一种便捷工具,可以帮助开发者以编程的方式更加方便地控制事务的生命周期,同时保持代码的简洁和可维护性。...
在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...
本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...
Spring 声明式事务和Spring 编程式事务
2. **Spring事务管理**:Spring提供了两种事务管理方式,即声明式事务管理和编程式事务管理。声明式事务基于AOP(面向切面编程),通过在配置文件或注解中声明事务规则,而编程式事务则是通过编程的方式来控制事务的...
编程式事务管理则是在代码中直接控制事务的开始、提交、回滚等操作,通常通过TransactionTemplate或PlatformTransactionManager接口实现。这种方式灵活性较高,但增加了代码复杂性,且容易导致事务管理代码分散,...
在 Spring 中,有两种类型的事务管理:编程式事务管理和声明式事务管理。编程式事务管理使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager。声明式事务管理有基于 tx 和 aop 名字空间的 xml ...
2. **Spring事务管理**:Spring提供了两种事务管理方式,即编程式事务管理和声明式事务管理。编程式事务管理通过TransactionTemplate或直接调用PlatformTransactionManager接口的方法来管理事务,而声明式事务管理则...
全面分析 Spring 的编程式事务管理与声明式事务管理 本文将从 Spring 的事务管理入手,深入讲解编程式事务管理和声明式事务管理的实现机制和原理。通过本文的学习,您将能够理解 Spring 事务管理的本质,并灵活运用...
Spring事务管理主要包括两种类型:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编写代码来控制事务的开始、提交或回滚等操作。这种方式灵活度高,但会使得代码变得冗余且难以维护。 - **声明式...
在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一过程。 首先,我们来看Spring事务的流程。当一个事务开始时,通常会经历以下步骤: 1. *...