首页 > 编程语言 >java srpint boot 2.2.1 第二部份,锁机制和分页查询 以及统一返回结果格式,

java srpint boot 2.2.1 第二部份,锁机制和分页查询 以及统一返回结果格式,

时间:2024-04-20 10:11:19浏览次数:20  
标签:Product java boot 1L srpint productMapper selectById getPrice id

第二部份,引起锁机制的原理和解决方案:

 测试环境搭建
第一步先建一个数据库表用于模拟商品购买。

CREATE TABLE product (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    stock INT NOT NULL,
    version INT NOT NULL DEFAULT 0
);

  第二步,新建一个商品类,用于等于mapper 产生方法,如果用插件lombok,   可以在类上面加上@Data 自动生产 自动生成get set 方法

import com.baomidou.mybatisplus.annotation.*;

@TableName("product")
public class Product {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer stock;
    private Integer version;
    // 省略Getter和Setter方法
}

第三步,编写 mapper 继承baseMapper, mapper 文件下面新建ProductMapper 接口

public interface ProductMapper extends BaseMapper<Product> {
}

 

最后编写测试用例:

 public void testConcurrentUpdate() {

        //1、小李获取数据
        Product p1 = productMapper.selectById(1L);
        System.out.println("小李取出的价格:" + p1.getPrice());

        //2、小王获取数据
        Product p2 = productMapper.selectById(1L);
        System.out.println("小王取出的价格:" + p2.getPrice());

        //3、小李加了50,存入数据库
        p1.setPrice(p1.getPrice() + 50);
        productMapper.updateById(p1);
p2.setPrice(p2.getPrice()-30); productMapper.updateById(p2); //最后的结果 //用户看到的商品价格 Product p3 = productMapper.selectById(1L); System.out.println("最后的结果:" + p3.getPrice()); }

运行结果:明明正确的 业务逻辑  应该是120  结果双方都取出数据来修改,后面修改的覆盖了前面的,

 解决方法一   

  直接锁住这个数据  实际上,在MyBatis中,并不直接使用Java代码来加数据库锁,而是通过编写特定的SQL语句来实现。使用数据库的 ​for update​语句可以进行行级锁定,这通常是在SQL查询中进行,例如: 

SELECT * FROM product WHERE id = 1 FOR UPDATE; 这将锁定id为1的商品记录,直到事务结束才会释放锁。
在MyBatis中可以使用如下方式来执行带有 ​for update​的SQL语句: 
@Select("SELECT * FROM product WHERE id = #{id} FOR UPDATE") Product lockProductForUpdate(Long id); 

注意,​FOR UPDATE​关键字的使用可能因数据库类型而异,你需要根据使用的具体数据库来调整相应的SQL语句。另外,在实际业务中,请留意事务的控制和锁的释放时机,避免出现死锁等问题。并且要手工编写sql 比较麻烦我们后面乐观锁,只需要配置可以直接自动应用,以下是悲观锁的流程示例,属于伪代码

@Test
public void testConcurrentUpdateWithPessimisticLock() {
    Product p = productMapper.selectById(1L);

    // 加悲观锁
    productMapper.lockProductForUpdate(1L);

    // 修改价格
    p.setPrice(p.getPrice() + 50);
    productMapper.updateById(p);

    // 解锁  操作完后自动解锁

    // 获取最终结果
    Product finalProduct = productMapper.selectById(1L);
    System.out.println("Final price: " + finalProduct.getPrice());
}

  解决方二   乐观锁

核心代码思路为以下截图:如果更新失败需要重新业务

 操作流程:

 

标签:Product,java,boot,1L,srpint,productMapper,selectById,getPrice,id
From: https://www.cnblogs.com/ZzwWan/p/18147157

相关文章

  • Google和Oracle关于Java的知识产权诉讼
    Google和Oracle关于Java的知识产权诉讼背景Oracle收购SUN之后立即对Oracle展开了诉讼.经历了多级法院的上诉和驳回.2021.4.5美国联邦最高法院判断.Google不侵权.无需赔偿Oracle提起的80亿美金的诉讼但是专利官司在美国科技史上影响很大.AMD跟Intel的关于x86......
  • [Java]volatile关键字
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18031966出自【进步*于辰的博客】启发博文:《Javavolatile关键字最全总结:原理剖析与实例讲解(简单易懂)》(转发)。参考笔记二,P73、P74.1。目录1、JMM规范2、并发编程的三......
  • GraalVM-云原生时代的JVM(Java)
    一、GraalVM是什么?GraalVM是Oracle开源的一款通用虚拟机产品,官方称之为UniversalGraalVM,是新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他......
  • java spring boot 2 开发实战笔记
    本案例是java spingboot 2.2.1  第一步搭建环境:安装依赖由于我们公司项目是1.8环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot代码也只能用1.8boot版本为:2.2.1,新建项目后,在xml文件中复制上以下代码xml配置,最精简运行起来的  需要配置一个数据库,8.0以......
  • springboot java调用flask python写的
    服务a用flask,服务b用的springboot,服务a写的接口,用python很容易就调通了,java来调,坑有点多1、url最后的斜杠必须两边对应上,否则flask会先308,而且contenttype[text/html;charset=utf-8],连对应的HttpMessageConverter都没有org.springframework.web.client.RestClientException:......
  • SpringBoot 上传图片
    1概述新做的博客系统需要在markdown文本中插入图片,之前完成过上传图片的相关配置,但未做总结,借着这个机会,对于springboot上传图片接口的相关配置和操作,做一个系统性阐述。以作为未来相关业务的参考。本文主要阐述后端相关配置,少量前端(vue3)内容仅是为了作为测试。2配置文......
  • 基于springboot的图书个性化推荐系统
     介绍图书个性化推荐系统的主要使用者分为管理员和学生,实现功能包括管理员:首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理,学生:首页、个人中心、图书预约管理、退换图书管理、我的收藏管理,前台首页;首页......
  • 基于Springboot+vue的图书管理系统
    ​ 介绍基于Springboot+vue的图书管理系统系统主要分为管理员角色和用户角色,具体的功能设计包括注册登录管理、个人中心管理、用户信息管理、图书信息管理、借阅信息管理,论坛信息管理等模块。软件架构开发系统:Windows10/11架构模式:MVCJDK版本:JavaJDK1.8开发工具:ID......
  • springBoot 读写分离 事务
      ShardingSphere-JDBC事务均用主库。 1.添加pom.xml<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><ver......
  • JavaScript 的 Mixin 问题
    JavaScript从ES6开始支持class了,如何在现在的class上实现mixin呢?很多人推荐这种搞法Object.assign(MyClass.prototype,MyMixin);这个做法很丑,不能令人满意。我找到了一个更有趣的做法,和dart比较接近:"Real"MixinswithJavaScriptClasses他最终的做法是......