【并发编程】MySQL锁及单机锁实现

目录

一、MySQL锁机制

1.1 按锁粒度划分

1.2 按锁功能划分

1.3 InnoDB锁实现机制

(1)记录锁(Record Lock)

(2) 间隙锁(Gap Lock)

(3) 临键锁(Next-Key Lock)

(4) 插入意向锁(Insert Intention Lock)

二、基于 JVM 本地锁实现,保证线程安全

2.1 线程不安全的分析

2.1.1 多线程并发访问(未加锁)

2.2 基于 synchronized 加锁访问

2.3 基于 synchronized 加锁访问

2.4 JVM 本地锁的缺陷

三、基于 MySQL 锁实现,保证线程安全问题

3.1 基于原子 SQL 实现

3.2 基于悲观锁实现(灵活多 SQL )

3.2.1 原生 SQL 实现

3.2.2 Java 代码实现

3.2.3 悲观锁优缺点

3.2.4 死锁演示

3.3 基于乐观锁实现(CAS)

3.3.1 原生SQL实现

3.3.2 Java 代码实现

3.3.3 乐观锁存在的问题

四、本地不同类型锁的总结


一、MySQL锁机制

1.1 按锁粒度划分

  • 表级锁​:锁定整张表

    • 优点:开销小,加锁快
    • 缺点:并发度低
    • 实现:LOCK TABLES语句或存储引擎自动加锁
  • 行级锁​:锁定单行记录

    • 优点:并发度高
    • 缺点:开销大,加锁慢
    • 实现:InnoDB通过索引实现
  • 页级锁​:锁定一页(16KB)

    • 折中方案,BDB引擎使用

1.2 按锁功能划分

  • 共享锁(S锁)​​:

    • 语法:SELECT ... LOCK IN SHARE MODE
    • 特性:多个事务可同时获取,但不能与排他锁共存
  • 排他锁(X锁)​​:

    • 语法:SELECT ... FOR UPDATE
    • 特性:独占锁,其他事务不能获取任何锁
  • 意向锁(Intention Lock)​​:

    • 表级锁,表示事务将要获取行锁
    • IS锁(意向共享锁):事务准备给行加S锁
    • IX锁(意向排他锁):事务准备给行加X锁

1.3 InnoDB锁实现机制

(1)记录锁(Record Lock)
  • 锁定索引中的单条记录
  • 实现方式:通过索引项加锁
(2) 间隙锁(Gap Lock)
  • 锁定索引记录间的间隙
  • 防止幻读问题
  • 示例:SELECT * FROM t WHERE id > 10 AND id < 20 FOR UPDATE
(3) 临键锁(Next-Key Lock)
  • 记录锁+间隙锁的组合
  • 锁定记录及记录前的间隙
  • InnoDB默认行锁算法
(4) 插入意向锁(Insert Intention Lock)
  • 特殊的间隙锁
  • 多个事务在相同间隙插入不同记录时不冲突

二、基于 JVM 本地锁实现,保证线程安全

2.1 线程不安全的分析

多线程环境下多个线程(并发用户访问)访问同一个共享资源,并对资源进行修改(触发了线程安全问题)。

接下来只关注 Service 层的逻辑实现

2.1.1 多线程并发访问(未加锁)

1. 创建多线程环境下生产级减库存案例

@Service
public class StockService {private Stock stock = new Stock();public void deduct(){stock.setStock(stock.getStock()-1);System.out.println("扣减成功,剩余库存:"+stock.getStock());}
}

2. 运行项目,通过 JMeter 进行并发测试

查看聚合报告,样本数量为 5000 次,吞吐量为 1900个事务/秒 左右。

3. 查看项目日志:发生超卖现象。

此时查看 MySQL 表中的 1001 商品编号的第一条记录,校验库存数量是否为0:

2.2 基于 synchronized 加锁访问

1. 修改减库存的方法,进行加锁操作:synchronized 直接修改方法(底层是基于 Monitor 实现)

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

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

相关文章

能耗优化新引擎:EIOT平台助力企业降本增效

安科瑞顾强 数字化转型的背景下&#xff0c;能源管理正加速向智能化、远程化方向演进。安科瑞电气推出的EIOT托管平台及ADW300系列4G无线计量仪表&#xff0c;通过云端技术与无线通信的深度融合&#xff0c;为用户打造了高效、便捷的远程能源监测与管理体系&#xff0c;助力企…

(14)Element Plus项目综合案例

本系列教程目录&#xff1a;Vue3Element Plus全套学习笔记-目录大纲 文章目录 第3章 综合案例3.1 搭建项目3.1.1 创建Vite工程3.1.2 配置路由 3.2 登录模块页面3.2.1 注册页面3.2.2 登录页面3.2.3 忘记密码页面 3.3 导航设置3.3.1 头部3.3.2 侧边栏与底部1&#xff09;头像部分…

Webug4.0靶场通关笔记22- 第27关文件包含

目录 一、文件包含 1、原理分析 2、文件包含函数 &#xff08;1&#xff09;include( ) &#xff08;2&#xff09;include_once( ) &#xff08;3&#xff09;require( ) &#xff08;4&#xff09;require_once( ) 二、第27关渗透实战 1、打开靶场 2、源码分析 3、…

〖 Linux 〗解决 VS Code 远程连接服务器的常见问题

文章目录 解决 VS Code 远程连接服务器的断开问题VS Code Remote-SSH一直弹出输入密码的问题VsCode C 语法检测失效不标红色波浪线 解决办法卸载扩展方式&#xff1a; 解决vscode C智能提示缓慢 解决 VS Code 远程连接服务器的断开问题 解决 vscode 卡顿&#xff0c;卡死&…

ERC-20与ERC-721:区块链代币标准的双星解析

一、代币标准的诞生背景 在以太坊生态中&#xff0c;代币标准是构建去中心化应用&#xff08;DApps&#xff09;的基石。ERC-20与ERC-721分别代表同质化与非同质化代币的两大核心标准&#xff0c;前者支撑着90%以上的加密资产流通&#xff0c;后者则开启了数字资产唯一性的新时…

C++入门小馆 :多态

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【NextPilot日志移植】整体功能概要

整体日志系统的实现功能 该日志系统主要实现了飞行日志的记录功能&#xff0c;支持多种日志记录模式&#xff0c;可将日志存储到文件或通过 MAVLink 协议传输&#xff0c;同时具备日志加密、空间管理、事件记录等功能。具体如下&#xff1a; 日志记录模式&#xff1a;支持按武…

数字化转型:概念性名词浅谈(第二十五讲)

大家好&#xff0c;今天接着介绍数字化转型的概念性名词系列。 &#xff08;1&#xff09;SOP(标准作业程序) 标准作业程序&#xff08;Standard Operating Procedure, SOPs&#xff09;是在有限时间与资源内&#xff0c;为了执行复杂的日常事务所设计的内部程序。从管理学的…

交叉编译 opencv-4.10

编译说明 opencv 下包含很多模块&#xff0c;各个模块的作用可以参考Opencv—模块概览. 嵌入式考虑有限存储等因素会对模块进行裁剪&#xff0c;我这里主要保留图像拼接&#xff08;stitching&#xff09;图片编解码&#xff08;imgcodecs&#xff09;与特征点匹配&#xff08…

Python cv2对象检测与跟踪:从基础到进阶实战

在计算机视觉领域&#xff0c;对象检测&#xff08;定位目标位置&#xff09;与对象跟踪&#xff08;持续追踪目标运动&#xff09;是视频分析、自动驾驶、智能监控等应用的核心技术。本文将结合OpenCV的cv2库&#xff0c;系统讲解其原理与Python实现方法。 一、对象检测 vs 对…

亚马逊推出新型仓储机器人 Vulcan:具备“触觉”但不会取代人类工人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

缓存套餐-03.功能测试

一.功能测试 点击小程序&#xff0c;就会触发根据分类id查询套餐方法&#xff0c;根据分类id查询套餐。 第一次查询&#xff0c;redis中没有数据&#xff0c;就会发sql进行sql数据库查询。 redis当中就有了对应的缓存。 再次点击&#xff0c;发现sql根本没有执行&#xff0c;…

WebFlux与HttpStreamable关系解析

1-Streamable 1-WebFlux与HttpStreamable关系解析2-MCP协议Streamable HTTP 2-参考网址 MCP协议Streamable HTTPMCP协议重大升级&#xff0c;Spring AI Alibaba联合Higress发布业界首个Streamable HTTP实现方案 3-WebFlux与HttpStreamable关系解析 WebFlux 和 HttpStreamabl…

顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%

导读&#xff1a;顺丰科技引入 Doris 替换 Presto&#xff0c;在内部可视化数据自助分析工具丰景台场景广泛应用。目前&#xff0c;顺丰临时查询业务、丰景台报表业务的 Presto 场景已经 100% 切换到 Doris 集群中&#xff0c;日均查询量 100W。并实现 P95 性能提升近 3 倍&…

如何在Jmeter中调用C程序?

在JMeter中调用C语言程序可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;使用OS Process Sampler JMeter的“OS Process Sampler”可以用来调用外部程序&#xff0c;包括C语言编写的可执行文件。 步骤&#xff1a; 准备C语言程序&#xff1a; 编写C语言代码并编译…

python 中的单例

在 Python 里&#xff0c;单例模式指的是一个类仅有一个实例&#xff0c;并且提供一个全局访问点来获取该实例。下面为你介绍几种实现单例模式的常见方法。 1. 使用模块 在 Python 里&#xff0c;模块天然就是单例模式。当模块被导入时&#xff0c;Python 会对其进行一次加载…

Linux58 ssh服务配置 jumpserver 测试双网卡 为何不能ping通ip地址

判断为NAT模式网卡 能ping 通外网 ens34为仅主机模式网卡 [rootlocalhost network-scripts]# ip route show default default via 10.1.1.254 dev ens33 proto static metric 100 10.0.0.0/8 dev ens33 proto kernel scope link src 10.1.1.37 metric 100 11.0.0.0/8 dev…

web 自动化之 selenium+webdriver 环境搭建及原理讲解

文章目录 一、web 自动化测试学习说明二、什么 web 自动化测试三、selenium 简介四、web自动化测试环境搭建五、web 自动化测试第一个脚本六、selenium 原理及源码讲解 一、web 自动化测试学习说明 进阶 web 自动化测试学习&#xff1a;掌握 python 编程基础 二、什么 web 自…

Linux 网络命名空间:从内核资源管理到容器网络隔离

1. 网络命名空间是什么? 网络命名空间(Network Namespace) 是 Linux 内核提供的一种网络资源隔离机制,用于为进程或容器创建完全独立的网络环境。它并非物理或虚拟的网络接口(如网卡、veth pair 等),而是一个虚拟容器,包含以下资源的独立实例: 网络接口(物理或虚拟)…

SQL知识点总结

总结的知识点主要来源于前段时间在牛客刷SQL题目中遇到的错误 目录 1.WHERE字句不能与高级函数连用 2.去重——distinct 3.不等于某个值 4.查多个范围内的值 5. 升/降序排序 6.占位符 7.统计某类别总数计算平均值 8.合并查询——UNION &#xff08;ALL&#xff09; 9…