SpringBoot的事务与锁

news2024/11/25 14:51:42

在一人一单问题里,为什么加了事务还是会出现一人下多单呢?
本质的原因是,我们使用Java的对象锁,可以保证临界区只有一个线程访问,但是这和SpringBoot里加@Transactional注解不是等价的。数据库里的事务保证的是要么全部完成要么全部不起作用。在开启事务的时候,会有不同的数据库锁保证并发性。但是并不能保证我们执行逻辑的正确性,见下面的例子。

@Transactional //事务 涉及两张表,需要事务
public void createVoucherOrder(VoucherOrder voucherOrder) {
    // 一人一单,检查用户是否下过单
    Long userId = voucherOrder.getUserId();
    int count = query().eq("user_id", userId).eq("voucher_id", voucherOrder).count();
    if (count > 0) {
        log.error("用户已经购买过");
        return;
    }
    // 扣减库存
    boolean success = seckillVoucherService.update()
            .setSql("stock=stock-1")
            .eq("voucher_id", voucherOrder.getVoucherId())
            .gt("stock", 0)
            .update();
    if (!success) {
        log.error("库存不足");
        return;
    }
    save(voucherOrder);
}

开启事务以后,对于第一个查是否下过单的操作,由于是快照读没有加锁,多个线程读到都是满足下单条件的。
第二步update就是当前读了,走了主键索引,会触发行级锁。
在这里插入图片描述

可以看出,加锁的类型是X型的记录锁,对那一行加了锁。
然后有第二个线程要执行同样的操作是会阻塞,但是不会下单失败。等第一个线程提交了,第二个线程也会提交。所以不能够解决一人一单的问题。
所以本质就是第一个操作没加锁,除非直接加表级锁,但是效率太低了。

所以可以用Java的对象锁来解决这个问题,但是不是简单的加sychronized就行了,可以详见这篇。为什么加了锁还有事务问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT+Word的智能化文字生成和应用

在Word中引入OpenAI代码需要使用VBA编辑器。以下是在Word中引入OpenAI代码的步骤: 打开Word文档,按下Alt F11键打开VBA编辑器。 在VBA编辑器中,选择“插入”菜单,然后选择“模块”。 在新建的模块中,将OpenAI代码粘…

【教学类-35-01】(256*256*256)RGB色卡图片

作品展示: 背景需求: 甲流传染病,班级来了三位孩子,他们玩折纸的时候讨论, 09号问:“绿色和蓝色混合是什么颜色?” 08号问:“绿色加蓝色加浅蓝合在一起是什么颜色” 17号说&…

逆向学习X64DBG

目标游戏:焰影神兵 目的:更改玩家名称(中文名称) 使用X64dbg可以快速搜索游戏人名,所以本次逆向使用该工具进行工作。 原来的名字:平家物语 现在我们想改成:源氏物语。所以打开X32/64dbg 附…

免费域名申请

title: 免费域名申请 20230428153405|left 🌈Description: ​ 本文将介绍如何免费申请域名,在最近的折腾中发现,域名真的很重要,不然好多服务是无法访问的。 备注:由于freenom基于技术原因,暂时…

感知机学习

定义 感知机:假设输入控件(特征空间)是 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn,输出空间是 Y { 1 , − 1 } \mathcal{Y}\left\{1, -1\right\} Y{1,−1},输入 x ∈ X \mathbf{x}\in\mathcal{X} x∈X表示实例的特征向量&#x…

使用Pano2VR实现背景音乐、放大/缩小、旋转、缩略图和直线/立体/鱼眼模式等

内容简介 本文在文章《使用Pano2VR实现客厅VR效果》基础上,增加背景音乐、放大/缩小、旋转、缩略图和直线/立体/鱼眼模式等;效果如下图(为了可以上传缩小屏幕,属于PC端运行): 实现过程 1. 运行Pano2VR软件后…

【初学人工智能原理】【1】一元一次函数:感知器如何描述直觉

前言 本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白,由于缺少图片可能无法理解,故放到了最后,建议直接看代码(代码放到了前面)。 代码实…

企业管理中,如何组建数据团队

数字化已经成为了当前时代的标志,也变为人们对未来社会发展的共识,一时间数字化相关技术、理念、应用都开始向各行各业普及。此时人工智能、云计算、大数据、互联网、物联网等的发展也越来越快,给人们的生活和企业的经营管理模式带来了深刻改…

设计模式 -- 原型模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

【问题解决】RabbitMQ启动出现epmd error for host xx.xx: nxdomain (non-existing domain)

问题描述 【k8s】或【普通容器】或【Linux】部署的RabbitMQ启动时出现了 epmd error for host xx.xx: nxdomain (non-existing domain) 错误,MQ无法启动成功。 其中 xx.xx 为无法解析的域名。 RabbitMQ官方还提到报错 Error during startup: {error,no_epmd_port}…

回归区间预测 | Matlab基于分位数随机森林算法(QRF)的回归预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 Matlab基于分位数随机森林算法(QRF)的回归预测,matlab代码。 基于分位数随机森林算法(QRF)回归预测,matiab代码,单变量输入模型。 评价指标包括:R2、MAE、MSE、RMSE和区间覆盖率和区间平均宽度百分比等,代码质…

【软件测试】自动化测试日志问题该怎么解决?测试老鸟总结方案...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

Leetcode力扣秋招刷题路-0801

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 nums1 和 nums2 。在一次操作中,我们可以交换 nums1[i] 和 nums2[i]的元素。 例如,如果 …

为什么越来越多的人开始学习大数据了?

现在,在数字化转型的推动下,越来越多的企业意识到大数据的魅力,并不断在这个领域投入资金,Python大数据开发相关人才也备受青睐! 大数据从业领域很宽广,不管是科技领域还是食品产业,零售业等都…

大数据行业就业前景怎么样呢

就目前的前景来看,大数据的发展的确的非常不错的~ 既然回答大数据的问题,那就让我们到用数据的方式来回答一下。大数据需求越来越多,只有技术在手不愁找不到工作。 先来看几个招聘网站的报告数据:Boss直聘发布的,今年…

Zynq-7000、FMQL45T900的GPIO控制(七)---linux驱动层配置GPIO中断输入

本文使用的驱动代码 (1条消息) FMQL45T900linux驱动外部中断输入ZYNQ-7000linux驱动外部中断输入资源-CSDN文库 在Zynq-7000、FMQL45T900驱动层也时常会用到对GPIO的控制,这里就针对实际使用的情况进行说明,首先根据之前的帖子确实使用GPIO编号 这里采…

从不均匀性角度浅析AB实验 | 京东云技术团队

作者:京东零售 路卫强 本篇的目的是从三个不均匀性的角度,对AB实验进行一个认知的普及,最终着重讲述AB实验的一个普遍的问题,即实验准确度问题。 一、AB实验场景 在首页中,我们是用红色基调还是绿色基调,是采用门店小列表外商品…

C++ 探索程序 详细解读程序在运行过程中都发生了什么

目录 头文件-源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期-运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象 宏 宏的其他用法 头文件-源代码 头文件(.h&am…

Baklib分享:关于FAQ页面的一些制作技巧

FAQ页面(Frequently Asked Questions)是企业网站中常见的一种页面,主要用于解答客户常见的问题。一个优秀的FAQ页面不仅能够提高客户的满意度,还能够减轻客服部门的工作量。下面将介绍一些制作FAQ页面的技巧,并推荐使用…

Mysql使用函数后不走索引怎么优化?

网上很多人说mysql一旦使用函数就不走函数,但是事实真的是如此吗?我先说明,并不是如此的,本篇文章会通过DAYOFWEEK()和substr()两个函数作为条件查询,看看究竟是否会走索引(其他函数同理)&#…