Spring中的事务传播行为

在 Spring 中可以使用 @Transactional 注解,将一个方法标记为一个事务方法
事务方法具有事务的 ACID 四大特性

其中 @Transactional 有一个属性 propagation 用来标记该事务的传播行为
Spring 支持的传播行为有这样几种:

默认情况是:REQUIRED

接下来举例说明:

/**
 * 购买一本书
 * 事务传播行为: REQUIRED
 */
@Transactional(propagation = Propagation.REQUIRED)
public void purchase(String username, String isbn) {

    //从数据库中找到书本单价
    int price = bookShopDao.findBookPriceByIsbn(isbn);

    //将该书的库存减一
    bookShopDao.updateBookStock(isbn);

    //从用户的余额中减去书的单价
    bookShopDao.updateUserAccount(username, price);
}
/**
 * 结账
 * 根据购书列表,循环调用 purchase 方法
 */
@Transactional
public void checkout(String username, List<String> isbns) {
    for (String isbn : isbns){
        bookShopService.purchase(username, isbn);
    }
}

假设用户要买 3 本书, 可用户的余额仅够买前 2 本书,那么在执行 checkout 结账事务时,就会抛出“余额不足”的异常

那么根据事务的传播行为会有这样的情况:
我们之前声明了 purchase 的事务传播行为是 REQUIRED,所以在 checkout 事务调用 purchase 时,purchase 发现有事务正在运行,所以就加入事务
按照顺序,前 2 本书的 purchase 都顺利完成了,可是第 3 个 purchase 出现了异常,所以导致整个 checkout 事务失败,则 3 个purchase 全部回滚。此时,用户余额不变,书的库存也不变

如果声明 purchase 的事务传播行为是 REQUIRED_NEW, 那么就会是这样的:
checkout 调用 purchase,此时 checkout 事务正在运行,但是 purchase 会将 checkout 事务挂起并重新建立一个自己的事务,自己的事务完成后,会重新唤醒 checkout 事务,如此循环,直到成功或是出现异常则停止
这样以后,用户在 checkout 结账后,账户余额会减去前 2 本书的单价,并且前 2 本书的库存也会减 1, 但第 3 本书的库存不会变

时间: 2024-11-05 20:33:41

Spring中的事务传播行为的相关文章

Spring中的事务传播属性详解

在使用Spring时,大部分会用到他的声明式事务,简单的在配置文件中进行一些规则配置,利用Spring的AOP功能就能轻松搞定事务问题:这里面就涉及到一个事务的传播属性问题Propagation,它在TransactionDefinition接口中定义,以供PlatfromTransactionManager使用,PlatfromTransactionManager是spring事务管理的核心接口. TransactionDefinition public interface Transacti

Spring中的事务管理实例详解_java

本文实例讲述了Spring中的事务管理.分享给大家供大家参考.具体分析如下: 事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性(ACID) ① 原子性(atomicity):事务室一个原子操作,有一系列动作组成.事务的原子性确保动作要么全部完成,要么完全不起作用 ② 一致性(consistency):一旦所有事务动作完成,事务就被提交.数据和资源就

spring中配置事务管理的问题

问题描述 spring中配置事务管理的问题 我的Spring配置文件中加上下面的配置,程序启动就报404,是为什么? <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" propagation="REQUIRED" read-only=&q

Spring中@Transactional事务回滚(含实例详细讲解,附源码)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删

在SPRING中实现事务暂停的方法

摘要 Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的.Spring的声明性事务分离可以应用到任何POJO目标对象,并且包含所有EJB基于容器管理事务中的已声明事务.后台的事务管理器支持简单的基于JDBC的事务和全功能的基于JTA的J2EE事务. 这篇文章详细的讨论了Spring的事务管理特性.重点是如何在使用JTA作为后台事务策略的基础上让POJO利用Spring的声明性事务,这也显示了Spring的事务服务可以无缝

在Spring中实现事务挂起

Spring Framework是一个流行的Java/J2EE应用框架,它构建于一个轻量级的反向控制(Inversion-of-Control,QoC)模式的容器的基础之上,以其数据访问和事务管理能力而著称.Spring的声明性事务划分适用于任何的POJO(pure old java object或plain ordinary Java object,无格式普通Java对象)目标对象,其声明性事务如同EJB容器托管事务(Container-Managed Transaction,CMT)一样完善

Spring事务传播特性的浅析——事务方法嵌套调用的迷茫

  Spring事务传播机制回顾     Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这是不认识Spring事务传播机制而造成的误解,Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法:  int getPropagationBehavior():事务的传播行为 int getIsolationLevel():

spring事务-hibernate4+spring中获取session

问题描述 hibernate4+spring中获取session 请问如果某个方法没有在spring中配置事务,比如查询的方法,那么在这个方法中能不能用getCurrentSession方法获取session? 解决方案 Hibernate4获取sessionSpring中关于hibernate的sessionspring3+hibernate4配置事务管理以及session获取问题. 解决方案二: 求大神解答 0.0 解决方案三: 如果 你不getCurrentSession 或者openSe

WCF事务传播

目录 事务流配置 事务流和操作合同 环境事务 事务性服务编程 事务传播模式 客户端和服务事务 表决和完成 总结 事务是构建强大可靠.高质量的面向服务的应用程序的关键.Windows Communication Foundation 为服务开发人员提供了简单的声明性事务支持,使 您能够完全在服务的作用域之外配置诸如事务流和表决等参数.此外,Windows Communication Foundation 还允许客户端应用程序创建事务,并跨服务边界传 播它们.在本专栏中,我将详细介绍如何在 Wind