开发者社区> D_H_T> 正文

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 本书的库存不会变
这里写图片描述

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
19215 0
spring中事务传播下,特殊方法手动控制事务
在开发中,遇到事务问题:从excel文件中解析导入数据,每个sheet页中的数据作为单个的事务单元提交数据库。解析下代码实现: 方法①:mainAnalysisEntrance(…)解析excel入口和权限和其他业务等处理; 方法②:analysisWorkbook(…)解析excel工作簿; 方法③:analysisPerSheet(…)解析每一个sheet页数据,并将其中通过的数
1843 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18712 0
Spring事务传播行为
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,如表下图所示。
834 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
10002 0
tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)
一定分布式开发经验的朋友都知道,产品/项目/系统最初为了能够快速迭代上线,往往不太注重产品/项目/系统的高可靠性、高性能与高扩展性,采用单体应用和单实例数据库的架构方式快速迭代开发;当产品/项目/系统做到一定规模的时候,原有的系统架构则不足以支撑义务发展需要
107 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
21673 0
+关注
D_H_T
java,编程语言相关技术专家
42
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载