`
liuluo129
  • 浏览: 116198 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 编程式事务管理

阅读更多

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。 然后,使用TransactionDefinitionTransactionStatus对象, 你可以启动,回滚和提交事务。

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方式

 

分享到:
评论

相关推荐

    spring编程式事务实现

    1. **Spring编程式事务管理**: 编程式事务管理允许开发者在代码中直接控制事务的开始、提交、回滚等操作。这种方式提供了更大的灵活性,但可能导致事务管理代码分散在整个应用中,增加维护难度。通常,这种方式...

    全面分析 Spring 的编程式事务管理及声明式事务管理

    本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...

    Spring 框架的事务管理及应用

    **示例:Spring编程式事务管理** Spring框架通过提供一系列事务管理相关的类,如`TransactionDefinition`、`TransactionStatus`和`PlatformTransactionManager`等,简化了编程式事务管理的过程。 ```java // 假设...

    spring编程式事物

    总之,Spring编程式事务管理是一种直接在代码中控制事务的方法,它适合于需要精细控制事务流控的场景。尽管声明式事务管理更常见,但编程式事务管理对于某些复杂情况仍然很有价值。结合源码理解和工具应用,开发者...

    spring学习笔记(十五)-编程式事务例子

    在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...

    详解Spring学习之编程式事务管理

    详解Spring学习之编程式事务管理 Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务管理。在本篇文章中,我们主要介绍编程式事务管理。 什么是编程式事务管理? 编程式事务管理是指通过编写代码...

    全面分析_Spring_的编程式事务管理及声明式事务管理

    本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...

    spring_tx编程式事务代码

    编程式事务管理允许开发者通过代码来精确控制事务的边界,而`TransactionTemplate`就是Spring为编程式事务管理提供的一种便捷工具。 `TransactionTemplate`类是Spring框架的`org.springframework.transaction....

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    在Java应用中,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理** 是通过调用`PlatformTransactionManager`接口提供的方法来手动控制事务的开始、提交、回滚。例如,你...

    全面分析_Spring_的编程式事务管理及声明式事务管理.

    本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...

    全面分析Spring的编程式事务管理与声明式事务管理.doc

    全面分析 Spring 的编程式事务管理与声明式事务管理 本文将从 Spring 的事务管理入手,深入讲解编程式事务管理和声明式事务管理的实现机制和原理。通过本文的学习,您将能够理解 Spring 事务管理的本质,并灵活运用...

    spring声明式事务管理配置方式

    - 声明式事务管理背后的实现原理是基于Spring的AOP(面向切面编程),它会在方法执行前后应用事务增强,从而实现事务的自动管理。 在提供的链接中,博主可能详细解释了这些概念,并给出了实际的应用示例,包括如何...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...

    spring学习之八--Hibernate编程式事务

    在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...

    spring事务案例分析.zip

    2. **Spring编程式事务管理**:虽然不如声明式事务方便,但在某些复杂场景下,如需要自定义事务处理逻辑,编程式事务管理提供了更多的灵活性。通过TransactionTemplate或PlatformTransactionManager接口,开发者可以...

    spring编程式和声明式事务管理

    它分为两种主要类型:编程式事务管理和声明式事务管理。这两种方式各有特点,适用于不同的场景。 首先,编程式事务管理是通过编写代码来控制事务的开始、提交、回滚以及异常处理。在Spring中,我们通常使用`...

    Spring事务管理Demo

    首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**:通过使用`PlatformTransactionManager`接口及其实现类(如`JdbcTemplate`或`HibernateTemplate`),开发者...

Global site tag (gtag.js) - Google Analytics