Spring提供两种方式的编程式事务管理:
-
使用
TransactionTemplate
-
直接使用一个
PlatformTransactionManager
实现
如果你选择编程式事务管理,Spring推荐使用 TransactionTemplate
。
使用TransactionTemplate
TransactionTemplate
采用与Spring中别的 模板 同样的方法, 如 JdbcTemplate
。它使用回调机制,将应用代码从样板式的资源获取和释放代码中解放出来, 这样写出的代码是目的驱动的,把精力集中在开发者想要做的事情上。
应用的代码必须在一个事务性的上下文中执行,这样就会像这样一样显式的使用TransactionTemplate
。你作为一个应用程序员, 会写一个 TransactionCallback
或TransactionCallbackWithoutResult的实现, (通常会用匿名类来实现 )这样的实现会包含所以你需要在该事务上下文中执行的代码。 然后你会把一个你自己实现TransactionCallback或TransactionCallbackWithoutResult
的实例传递给TransactionTemplate
暴露的execute(..)
方法。
public class PointPayService implements IPayService { private final TransactionTemplate transactionTemplate; public PointPayService(PlatformTransactionManager platformTransactionManager) { Assert.notNull(platformTransactionManager, "The 'PlatFormTransactionManager' arguement must not be null!"); transactionTemplate = new TransactionTemplate(platformTransactionManager); transactionTemplate.setTimeout(30); transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ); } @Override public String pay(final long userId, final long money) { return transactionTemplate.execute(new TransactionCallback<String>() { @Override public String doInTransaction(TransactionStatus transactionStatus) { System.out.println("用户:" + userId + "使用积分支付金额:" + money); return "ok"; } }); } private void transactionWithoutReturn() { // 不需要返回值时使用TransactionCallbackWithoutResult transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { operation1(); operation2(); } catch (Exception e) { // 抛出异常时进行回滚 transactionStatus.setRollbackOnly(); } } private void operation1() { } private void operation2() { } }); } }
使用Spring XML配置来定制TransactionTemplate的事务属性。 'TransactionTemplate'可以被注入到所有需要的服务中去。
<bean id="sharedTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/> <property name="timeout" value="30"/> </bean>"
最后,TransactionTemplate 类的实例是线程安全的,任何状态都不会被保存。 TransactionTemplate 实例 的确会 维护配置状态,所以当一些类选择共享一个单独的 TransactionTemplate实例时, 如果一个类需要使用不同配置的TransactionTemplate(比如,不同的隔离等级), 那就需要创建和使用两个不同的TransactionTemplate。
使用PlatformTransactionManager
也可以使用 org.springframework.transaction.PlatformTransactionManager
来直接管理你的事务。只需通过bean的引用,简单的把你在使用的PlatformTransactionManager
传递给你的bean。 然后,使用TransactionDefinition
和TransactionStatus
对象, 你可以启动,回滚和提交事务。
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); // 设置事务名称 def.setName("SomeTxName"); // 设置事务传播行为 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = txManager.getTransaction(def); try { // execute your business logic here } catch (Exception ex) { txManager.rollback(status); throw ex; } txManager.commit(status);
一般情况下我们使用声明式事务方式,在有特殊情况下要使用编程式事务时,推荐使用TransactionTemplate方式
相关推荐
1. **Spring编程式事务管理**: 编程式事务管理允许开发者在代码中直接控制事务的开始、提交、回滚等操作。这种方式提供了更大的灵活性,但可能导致事务管理代码分散在整个应用中,增加维护难度。通常,这种方式...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏...
**示例:Spring编程式事务管理** Spring框架通过提供一系列事务管理相关的类,如`TransactionDefinition`、`TransactionStatus`和`PlatformTransactionManager`等,简化了编程式事务管理的过程。 ```java // 假设...
总之,Spring编程式事务管理是一种直接在代码中控制事务的方法,它适合于需要精细控制事务流控的场景。尽管声明式事务管理更常见,但编程式事务管理对于某些复杂情况仍然很有价值。结合源码理解和工具应用,开发者...
在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...
详解Spring学习之编程式事务管理 Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务管理。在本篇文章中,我们主要介绍编程式事务管理。 什么是编程式事务管理? 编程式事务管理是指通过编写代码...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...
编程式事务管理允许开发者通过代码来精确控制事务的边界,而`TransactionTemplate`就是Spring为编程式事务管理提供的一种便捷工具。 `TransactionTemplate`类是Spring框架的`org.springframework.transaction....
在Java应用中,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理** 是通过调用`PlatformTransactionManager`接口提供的方法来手动控制事务的开始、提交、回滚。例如,你...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
全面分析 Spring 的编程式事务管理与声明式事务管理 本文将从 Spring 的事务管理入手,深入讲解编程式事务管理和声明式事务管理的实现机制和原理。通过本文的学习,您将能够理解 Spring 事务管理的本质,并灵活运用...
- 声明式事务管理背后的实现原理是基于Spring的AOP(面向切面编程),它会在方法执行前后应用事务增强,从而实现事务的自动管理。 在提供的链接中,博主可能详细解释了这些概念,并给出了实际的应用示例,包括如何...
本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...
在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...
2. **Spring编程式事务管理**:虽然不如声明式事务方便,但在某些复杂场景下,如需要自定义事务处理逻辑,编程式事务管理提供了更多的灵活性。通过TransactionTemplate或PlatformTransactionManager接口,开发者可以...
它分为两种主要类型:编程式事务管理和声明式事务管理。这两种方式各有特点,适用于不同的场景。 首先,编程式事务管理是通过编写代码来控制事务的开始、提交、回滚以及异常处理。在Spring中,我们通常使用`...
首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**:通过使用`PlatformTransactionManager`接口及其实现类(如`JdbcTemplate`或`HibernateTemplate`),开发者...