springboot怎么保证事务隔离(springboot如何控制事务)

技术Springboot在有锁的情况下怎么正确使用事务这篇文章主要介绍“Springboot在有锁的情况下怎么正确使用事务”,在日常操作中,相信很多人在Springboot在有锁的情况下怎么正确使用事务问题上存在疑惑,小

本文主要介绍“当Springboot有锁时如何正确使用事务”。在日常操作中,相信很多人对于Springboot有锁的情况下如何正确使用事务都有疑问。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“跳羚有锁如何正确使用交易”的疑惑!接下来,请和边肖一起学习!

00-1010俗话说,想赚钱,就去看看有钱人需要什么。因为富人有更多的钱,他们赚得更多。

离家近一点,在Java项目的研发中,“锁”这个词并不陌生,最经典的使用场景就是商品超卖。

很多Java白人通常认为给代码加个“锁”就能解决多扣库存的问题,却忽略了数据库事务的问题。今天,我们将做一个实验来分析商品的超卖问题。

1. 概述

有产品,只剩一件库存。

购买商品时,做三个动作:第一,检查库存,第二,扣除库存,第三,生成订单,三个动作在一次交易中执行。

模拟并发场景,用10个线程同时执行用户购买商品的操作。

2. 场景介绍

3. 代码实现

@ Transactional(roll back for=exception . class)

public void buy(){ 0

//检查商品是否有货。

integer count=GetProductCount();

if(计数=0){ 0

ThrownewRuntimeException('库存为0 ');

}

//库存减少

product repository . reduce count();

//生成订单

create ORder();

}首先,我们正常编写业务逻辑,使用@Transactional注释来控制事务。

通过并行实验,产生了超卖现象。

3.1 不加锁的代码实现

@ Transactional(roll back for=exception . class)

public synchronized void buy(){ 0

//检查商品是否有货。

integer count=GetProductCount();

if(计数=0){ 0

ThrownewRuntimeException('库存为0 ');

}

//库存减少

product repository . reduce count();

//生成订单

n

bsp;  createOrder();
    }

这次我们使用 synchronized 关键字给方法加了把“锁”,理论上应该不会产生超卖现象了吧。

经实验,仍然产生了超卖现象。

因为虽然方法被锁住了,可是@Transactional 注解并没有及时的提交事务,导致库存没有及时扣减为0,因此还是超卖了。

3.3 正确使用事务的代码实现

@Autowired
    private PlatformTransactionManager platformTransactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;

    // @Transactional(rollbackFor = Exception.class)
    public synchronized void buy() {

        // 开启事务
        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);

        try {
            // 查看是商品否有库存
            Integer count = getProductCount();
            if(count <= 0) {
                throw new RuntimeException("库存为 0");
            }

            // 减库存
            productRepository.reductCount();

            // 生成订单
            createOrder();

            // 事务提交
            platformTransactionManager.commit(transactionStatus);
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            // 事务回滚
            platformTransactionManager.rollback(transactionStatus);
        }

    }

这次我们不使用@Transactional 注解管理事务了,改为手动管理事务。

经实验,解决了超卖现象。

到此,关于“Springboot在有锁的情况下怎么正确使用事务”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/150320.html

(0)

相关推荐

  • 生茶,普洱茶是生茶好还是熟茶好

    技术生茶,普洱茶是生茶好还是熟茶好普洱茶生茶和熟茶各有特色,没有谁好谁坏,普洱茶生茶制作工艺为杀青、揉捻后蒸压成饼,普洱熟茶则主要为渥堆发酵生茶;颜色方面,普洱生茶初为青绿、墨绿,而普洱熟茶颜色呈红褐色;普洱生茶口感强烈

    生活 2021年10月22日
  • C++怎么为模板参数定义概念

    技术C++怎么为模板参数定义概念这篇文章主要讲解了“C++怎么为模板参数定义概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么为模板参数定义概念”吧!T.10:

    攻略 2021年11月24日
  • 长发发型扎法100种图片,女孩子的长头发怎么扎好看

    技术长发发型扎法100种图片,女孩子的长头发怎么扎好看发型一长发发型扎法100种图片:高马尾。马尾对头发的长度是没有限制的,只要是中长发以上都可以扎,而且高马尾也比较利落、活泼又很减龄,各种场合扎都合适。发型二:花苞头。

    生活 2021年11月1日
  • 如何用Python爬取高颜值美女

    技术如何用Python爬取高颜值美女如何用Python爬取高颜值美女,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1 数据源知乎话题『美女』下所有问题中回答

    攻略 2021年10月26日
  • 如何理解SaaS软件的技术缺陷以及解决方法

    技术如何理解SaaS软件的技术缺陷以及解决方法今天就跟大家聊聊有关如何理解SaaS软件的技术缺陷以及解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

    攻略 2021年10月29日
  • Socket基础知识有哪些

    技术Socket基础知识有哪些本篇文章给大家分享的是有关Socket基础知识有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。如何一步步掌握Socket相

    攻略 2021年11月25日