Spring 声明式事务机制

2023-08-15 21:55:29

😀前言
本篇是Spring 声明式事务系列的第二篇介绍了Spring 声明式事务机制

🏠个人主页:尘觉主页
在这里插入图片描述

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

在csdn获奖荣誉: 🏆csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

🤩声明式事务机制

😄事务的传播机制

事务的传播机制说明

  1. 当有多个事务处理并存时,如何控制?
  2. 比如用户去购买两次商品(使用不同的方法), 每个方法都是一个事务,那么如何控制呢?
  3. 这个就是事务的传播机制,看一个具体的案例(如图)

img

img

🥰事务传播机制种类

● 事务传播的属性/种类一览图

img

● 事务传播的属性/种类机制分析,

重点分析了 REQUIRED 和 REQUIRED_NEW 两种事务 传播属性, 其它知道即可(看上图)

img

img

● 事务的传播机制的设置方法

img

● REQUIRES_NEW 和 REQUIRED 在处理事务的策略

img

  1. 如果设置为 REQUIRES_NEW

buyGoods2 如果错误,不会影响到 buyGoods()反之亦然,即它们的事务是独立的.

  1. 如果设置为 REQUIRED

buyGoods2 和 buyGoods 是一个整体,只要有方法的事务错误,那么两个方法都不会执行成功.!

😋事务的传播机制-应用实例

● 事务的传播机制需要说明

  1. 比如用户去购买两次商品(使用不同的方法), 每个方法都是一个事务,那么如何控制呢?
    =>这个就是事务的传播机制
  2. 看一个具体的案例(用 required/requires_new 来测试):

修改 GoodsDao.java, 增加方法

public class GoodsDao {
/**
     * 根据商品id,返回对应的价格
     * @param id
     * @return
     */
    public Float queryPriceById2(Integer id) {
        String sql = "SELECT price From goods Where goods_id=?";
        Float price = jdbcTemplate.queryForObject(sql, Float.class, id);
        return price;
    }

    /**
     * 修改用户的余额 [减少用户余额]
     * @param user_id
     * @param money
     */
    public void updateBalance2(Integer user_id, Float money) {
        String sql = "UPDATE user_account SET money=money-? Where user_id=?";
        jdbcTemplate.update(sql, money, user_id);
    }

    /**
     * 修改商品库存 [减少]
     * @param goods_id
     * @param amount
     */
    public void updateAmount2(Integer goods_id, int amount){
        String sql = "UPDATE goods_amount SET goods_num=goods_num-? Where goods_id=?";
        jdbcTemplate.update(sql, amount , goods_id);
    }
}

修改 GoodsService.java 增加 buyGoodsByTx02(), 使用默认的传播机制

注解解读
1. 使用@Transactional 可以进行声明式事务控制
2. 即将标识的方法中的,对数据库的操作作为一个事务管理
3. @Transactional 底层使用的仍然是AOP机制
4. 底层是使用动态代理对象来调用buyGoodsByTx
5. 在执行buyGoodsByTx() 方法 先调用 事务管理器的 doBegin() , 调用 buyGoodsByTx()
如果执行没有发生异常,则调用 事务管理器的 doCommit(), 如果发生异常 调用事务管理器的 doRollback()

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void buyGoodsByTx(int userId, int goodsId, int amount) {


        //输出购买的相关信息
        System.out.println("用户购买信息 userId=" + userId
                + " goodsId=" + goodsId + " 购买数量=" + amount);

        //1.得到商品的价格
        Float price = goodsDao.queryPriceById(userId);
        //2. 减少用户的余额
        goodsDao.updateBalance(userId, price * amount);
        //3. 减少库存量
        goodsDao.updateAmount(goodsId, amount);

        System.out.println("用户购买成功~");

    }

@Transactional
    public void buyGoodsByTx2(int userId, int goodsId, int amount) {


        //输出购买的相关信息
        System.out.println("用户购买信息 userId=" + userId
                + " goodsId=" + goodsId + " 购买数量=" + amount);

        //1.得到商品的价格
        Float price = goodsDao.queryPriceById2(userId);
        //2. 减少用户的余额
        goodsDao.updateBalance2(userId, price * amount);
        //3. 减少库存量
        goodsDao.updateAmount2(goodsId, amount);

        System.out.println("用户购买成功~");

    }

创建MultiplyService类

解读

  1. multiBuyGoodsByTx 这个方法 有两次购买商品操作

  2. buyGoodsByTx 和 buyGoodsByTx2 都是声明式事务

  3. 当前buyGoodsByTx 和 buyGoodsByTx2 使用的传播属性是默认的 REQUIRED [这个含义前面讲过了
    即会当做一个整体事务进行管理 , 比如buyGoodsByTx方法成功,但是buyGoodsByTx2() 失败,会造成 整个事务的回滚 即会回滚buyGoodsByTx

  4. 如果 buyGoodsByTx 和 buyGoodsByTx2 事务传播属性修改成 REQUIRES_NEW
    这时两个方法的事务是独立的,也就是如果 buyGoodsByTx成功 buyGoodsByTx2失败, 不会造成 buyGoodsByTx回滚.

@Service
public class MultiplyService {
    @Resource
    private GoodsService goodsService;


    
    @Transactional
    public void multiBuyGoodsByTx() {

        goodsService.buyGoodsByTx(1, 1, 1);
        goodsService.buyGoodsByTx2(1, 1, 1);
    }
}

测试 TxTest.java,

可以验证:为 REQUIRED buyGoodsByTx 和 buyGoodsByTx02 是整体, 只要有方法的事务错误,那么两个方法都不会执行成功

@Test
public void buyGoodsByMulTxTest() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("tx_ioc.xml");
MultiplyTxService bean = ioc.getBean(MultiplyTxService.class);
bean.multiTxTest();
System.out.println("------ok--------");
}

故意写错

img

修 改 GoodsService.java ,

将 传 播 机 制 改 成 REQUIRES_NEW 可 以 验 证 : 设 置 为 REQUIRES_NEW

buyGoodsByTx 如果错误不会影响到 buyGoodsByTx02()反之亦然,也就 是说它们的事务是独立的

将二个方法的 @Transactional修改为下面的这种形式 完成测试
@Transactional(propagation = Propagation.REQUIRES_NEW)

😄总结

本篇介绍了事务传播机制种类和事务的传播机制-应用实例希望可以帮到大家

😘Spring 声明式事务系列

第一篇–> 什么是Spring 声明式事务详细讲解

😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

更多推荐

基于Java演唱会购票系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

JavaScript知识系列(3)每天10个小知识点

目录系列文章目录JavaScript知识系列(1)每天10个小知识点JavaScript知识系列(2)每天10个小知识点知识点**20.AJAX**的概念、作用、原理、特性、优点、缺点、区别、使用场景**,实现一个AJAX请求****21.尾调用**的概念、作用、原理、特性、优点、缺点、区别、使用场景**22.ES6模

互联网数字化管理升级,制造企业一站式智能管理,可定制-亿发

在互联网时代,传统机械制造企业面临着未有的挑战和机遇。信息化管理水平成为企业竞争力的关键因素。然而,许多制造企业在信息化管理中常常陷入以下三大问题:1、盲目随潮流,缺乏总体规划互联网时代,科技发展日新月异,让制造企业感到需要跟上潮流。然而,盲目跟风而行往往导致了技术的不合理使用和资源的浪费。解决这个问题的关键在于建立明

运维:Centos7安装解压版mysql5.7

目录1、卸载Centos7默认自带的mariadb数据库,避免冲突2、下载解压版mysql并安装3、配置mysql4、mysql客户端访问MySQL是一种开源的关系型数据库管理系统(RDBMS),它具有许多优点和一些缺点。以下是MySQL的主要优缺点:优点1.开源免费:MySQL是开源软件,可以免费使用,并且有大量的社

机器视觉常见的问题及解决

应该怎样选择相机?选择相机却往往刻不容缓的的问题摆在机器视觉工程师面前,因此,选择相机了解以下几个方面问题:通常您首先需要知道系统精度要求和相机分辨率,可以通过公式:X方向系统精度(X方向像素值)=视野范围(X方向)/CCD芯片像素数量(X方向);Y方向系统精度(Y方向像素值)=视野范围(Y方向)/CCD芯片像素数量(

面试失败的反思:如何从错误中吸取教训

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

服务器搭建(TCP套接字)-epoll版(服务端)

epoll是一种在Linux系统上用于高效事件驱动编程的I/O多路复用机制。它相比于传统的select和poll函数具有更好的性能和扩展性。epoll的主要特点和原理:1、事件驱动:epoll是基于事件驱动的模型,它通过监听事件来触发相应的回调函数,而不是像传统的阻塞模型那样持续轮询。这样可以避免无效的轮询操作,提高效

开源项目在面试中的作用:如何用你的贡献加分

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

STM32F4X UCOSIII 消息队列

STM32F4XUCOSIII消息队列消息队列消息队列的作用消息队列工作机制消息队列创建消息发送消息发送模式FIFO(先进先出)LIFO(后进先出)消息接收消息队列删除消息队列常用函数消息队列创建函数消息队列发送函数消息队列接收函数消息队列删除函数UCOSIII消息队列例程消息队列消息队列的作用消息队列是一种常用于任务

全渠道零售趋势——现代零售业成功的关键

在快节奏的零售时代,无论通过什么渠道购物,消费者越来越习惯无缝购物体验。因此,保持线上和线下购物体验的一致性有助于在品牌与购物者之间建立信任,这也是每个零售商的首要任务。在本文中,我们将介绍现代零售业成功的关键——全渠道零售趋势,帮助零售商实现现代零售业的成功。什么是全渠道零售体验?全渠道零售是一种使零售商能够在所有渠

孙宇晨:稳定币支付交易具百倍增长潜力 后FTX时代行业仍需修炼内功

9月14日,波场TRON创始人、火币HTX全球顾问委员会成员孙宇晨受邀出席于新加坡举办的TOKEN2049,并参加了“生态系统和行业增长:展望加密货币的未来十年”主题板块的讨论。孙宇晨在发言中表示,接下来的10年里,加密货币和区块链的最大日常应用场景仍然是稳定币支付交易,预计将有百倍规模增长。他同时指出,一系列风险事件

热文推荐