一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景

news2024/11/24 2:34:20

大家好,我是冰点,今天给大家带来,关于MySQL中的锁的使用。 我首先提个问题,大家知道什么是 乐观锁、悲观锁、共享锁,、排它锁、行锁、表锁,以及每种锁的使用场景吗?

!! 背景:最近在各种群和博客里,又看见了什么[乐观锁]、悲观锁什么鬼的感觉很高级的词汇,于是乎今天对这几个概念进行整理一下,揭开它神秘的面纱,给大家提供一个基本参考。作为开发人员不管是用什么编程语言,我觉得这些是应该要掌握的。知其然,知其所以然。

锁机制是 MySQL 中用来保证并发访问数据库时数据一致性和完整性的重要机制。在并发访问中,多个事务可能同时对同一份数据进行操作。如果不采用锁机制,就会出现数据错乱和丢失的问题。MySQL 中的锁机制主要包括以下几种类型:

1. 乐观锁

乐观锁是指在数据更新操作时,先读取数据并记录版本号,然后在更新时检查版本号是否发生变化,如果没有变化,则继续更新,否则回滚操作。乐观锁适用于并发度高的场景,因为乐观锁不会限制其他事务对数据的访问,如果数据冲突,则只需要回滚操作即可。 如果使用mybatis-plus 可以做直接配置

使用场景:适用于并发度高的场景,例如在高并发的电商网站中,多个用户同时对同一个商品进行下单操作。

示例 SQL:

-- 获取商品库存数量和版本号
SELECT stock, version FROM product WHERE id= 1;

-- 更新商品库存数量
UPDATE product SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = 1;

2. 悲观锁

悲观锁是指在数据更新操作时,先加锁,然后再更新数据,更新完成后再释放锁。悲观锁适用于并发度低的场景,因为悲观锁会限制其他事务对数据的访问,如果没有必要,就会影响并发性能。MySQL 中的悲观锁主要有共享锁和排它锁两种。

使用场景:适用于并发度低的场景,例如在银行系统中,多个用户同时对同一个账户进行转账操作。

示例 SQL:

-- 对账户进行排它锁定
SELECT balance FROM account WHERE id = 1 FOR UPDATE;

-- 用户 A 进行转账操作
UPDATE account SET balance = balance - 100 WHERE id = 1;

-- 用户 B 进行转账操作
UPDATE account SET balance = balance + 100 WHERE id = 1;

-- 释放锁
COMMIT;

3. 共享锁

共享锁是指多个事务可以共享同一份数据,但是不能同时进行更新操作。在获取共享锁之后,其他事务只能获取共享锁,不能获取排它锁。共享锁适用于读多写少的场景,可以提高并发度。

使用场景:适用于读多写少的场景,例如在新闻网站中,多个用户同时对同一篇文章进行阅读操作。

示例 SQL:

-- 对文章进行共享锁定
SELECT * FROM article WHERE id = 1 LOCK IN SHARE MODE;

-- 用户 A、用户 B 和用户 C 同时读取文章内容
SELECT title, content FROM article WHERE id = 1;

-- 释放锁
COMMIT;

4. 排它锁

排它锁是指在获取锁之后,其他事务不能获取任何类型的锁,也不能进行读取和更新操作。排它锁适用于写多读少的场景,可以保证数据的一致性和完整性。

使用场景:适用于写多读少的场景,例如在订单系统中,多个用户同时对同一份订单进行修改操作。

示例 SQL:

-- 对订单进行排它锁定
SELECT * FROM orders WHERE id = 1 FOR UPDATE;

-- 用户 A 进行修改操作
UPDATE orders SET status = 'paid' WHERE id = 1;

-- 用户 B 进行修改操作
UPDATE orders SET status = 'shipped' WHERE id = 1;

-- 释放锁
COMMIT;

5. 行锁

行锁是指在对数据的某一行进行操作时,只对该行进行锁定,其他行不受影响。行锁适用于并发度高的场景,可以提高并发性能。

使用场景:适用于并发度高的场景,例如在社交网站中,多个用户同时对同一篇文章进行点赞操作。

示例 SQL:

-- 对点赞行进行行锁定
SELECT * FROM like WHERE user_id = 1 AND article_id = 1 FOR UPDATE;

-- 用户 A 进行点赞操作
INSERT INTO like (user_id, article_id) VALUES (1, 1);

-- 用户 B 进行点赞操作
INSERT INTO like (user_id, article_id) VALUES (2, 1);

-- 用户 C进行点赞操作
INSERT INTO like (user_id, article_id) VALUES (3, 1);

-- 释放锁
COMMIT;

6. 表锁

表锁是指在对整个表进行操作时,对整个表进行锁定,其他事务不能对该表进行任何操作。表锁适用于并发度低的场景,因为表锁会限制其他事务对数据的访问,如果没有必要,就会影响并发性能。

使用场景:适用于并发度低的场景,例如在定时任务系统中,多个任务同时对同一张表进行查询操作。

示例 SQL:

-- 对整个表进行表锁定
LOCK TABLES task READ;

-- 多个任务进行查询操作
SELECT * FROM task WHERE status = 'pending';

-- 释放锁
UNLOCK TABLES;

总结

!! 锁的掌握,应该是每个开发人员必备的技能,同样锁的使用需要根据具体场景和业务需求进行调整和优化。如果锁的粒度过大或过小,都会影响并发性能和系统的稳定性。在使用锁时,需要根据具体情况选择不同的锁类型和锁粒度,以提高并发性能和保证数据安全。同时,需要注意锁的使用方式和时机,避免死锁和长时间等待的情况出现。

 

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

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

相关文章

Unity 使用 VSCode 作为默认编辑器,解决没有代码提示,智能补全功能

文章目录 删除现有编辑器配置选择 VSCode 作为代码编辑器代码补全和智能提示 删除现有编辑器配置 首先打开你的项目文件夹,需要把这几个文件删掉,稍后重新生成~ 选择 VSCode 作为代码编辑器 打开 Edit - Preference: 选择 External Script…

【bsauce读论文】2023-SP-内核Use-After-Cleanup漏洞挖掘与利用

本文参考G.O.S.S.I.P 阅读推荐 2023-01-06 UACatcher做一些补充。 1. UAC漏洞介绍 UAC漏洞介绍:Use-After-Cleanup (UAC)漏洞类似UAF,本文主要检测Linux内核中UAC漏洞。UAC基本原理参见图Fig-1。首先,UAC漏洞和系统中…

众多行业适用的这款Lighthouse Apex Z便携粒子计数器有什么优势

Lighthouse Apex Z粒子计数器围绕易用性和可靠性进行构建。是建立在Lighthouse洁净室行业 40 多年的基于问题的学习基础上的解决方案。 采样设置 ApexZ易于使用的样品设置,可以匹配当前的sop,减少丢失位置或采样错误参数的风险。 用户管理 为了提高效…

ES6:var 、const、let的使用和区别

前言 本文主要介绍了ES6中var、const、let的使用和区别 基本介绍 let let声明变量 const const :声明常量const声明的常量可以修改,但不能重新赋值 如:以下代码是正确的: //引用数据类型 const info {name:Candy }; info.nameJune;而下面的代码是…

GPT-4国内有免费平替吗?

免费/平替永远是最贵的 就如同我们生活中买口红一样,总想找到平替,但永远比不上看中的那只! 但在寻找平替过程中 花出去的时间、金钱成本都是翻倍的。 那么GPT-4呢? GPT-4优于GPT-3.5闪光点,想必大家都十分清楚 不…

基于springboot自动排课系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SpringBoot 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:…

云计算安全

前言 什么是云计算? 云计算就是一种新兴的计算资源利用方式,云计算的服务商通过对硬件资源的虚拟化,将基础IT资源变成了可以自由调度的资源池,从而实现IT资源的按需分配,向客户提供按使用付费的云计算服务。用户可以…

帽子设计作品——蒸汽朋克的乌托邦,机械配件的幻想世界!

蒸汽朋克是由蒸汽steam和朋克punk两个词组成, 蒸汽代表着以蒸汽机作为动力的大型机械,而朋克则代表一种反抗、叛逆的精神。 蒸汽朋克的作品通常以蒸汽时代为背景,通过如新能源、新机械、新材料、新交通工具等新技术,使画面充满想…

基于OpenCV和PyQt5的跳远成果展示程序

基于OpenCV和PyQt5的跳远成果展示程序 近年来,体育运动越来越受到人们的关注,其中跳远是一项备受瞩目的运动项目。为了更好地展示运动员的跳远成果,本文将介绍一种基于OpenCV和PyQt5的跳远成果展示程序实现方法。 本文的跳远成果展示程序主…

基于SSM的校园办公管理系统的设计与实现(源码完整)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台,该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元,该板卡具有4个FMC子卡接口(其中有2个为FMC接口)&#xf…

Sui如何进行独立审计

Sui及其生态项目的第三方审计对于网络的安全至关重要。 类似于Sui这样的L1区块链必须使用多重有效的措施,来确保项目保持尽可能高的安全级别。Sui流程中的一个关键环节就是使用第三方安全审计。了解Sui的安全状态及其维护方式对整个社区来说很重要,因此…

【JavaSE】Java基础语法(二)

文章目录 1. ⛄类型转换1.1 🪂🪂隐式转换1.2 🪂🪂强制转换 2. ⛄运算符2.1 🪂🪂算术运算符2.1.1 算术运算符2.1.2 字符的“”操作2.1.3 字符串的“”操作2.1.4 数值拆分 2.2 🪂🪂自增…

SQL注入 - Part 2

SQL注入 - Part 2 1.sql注入自动化工具--sqlmap配置环境变量/快捷方式一些sqlmap的常用语句前置SQL知识batch批量注入 2.sql注入靶场——sqlilabs3.布尔盲注4.基于时间的盲注5.基于报错的注入总结 1.sql注入自动化工具–sqlmap 配置环境变量/快捷方式 最终效果: …

数据高效转储,生产轻松支撑

在使用WINDOWS或智能手机的时候,经常会遇到存储空间不足的问题,鲜有人会打开文件管理系统自己逐个清理,不仅因为底层的系统文件繁多操作耗时,更有其操作专业度高、风险高的问题。这时我们往往会求助各种各样的清理大师&#xff0c…

2个月拿到华为offer,身为00后的我拿30K没问题吧?

背景介绍 美本计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三回国的时间比较短,于是找的实习是在一家初创公司里面做全栈。 本人面…

网络安全CTF工具合集

各种在线工具以及工具整合 CTF资源库|CTF工具下载|CTF工具包|CTF工具集合 逆向工程: GDB – http://www.gnu.org/software/gdb/download/ IDA Pro – Download center Immunity Debugger – http://debugger.immunityinc.com/ OllyDbg – OllyDbg v1.10 radare2 – radare Hop…

MySQL基于成本的优化

MySQL的成本是什么?MySQL在执行一个查询的时候,其实是有多种不同的方案的,但是最终会选择一种成本比较低的方案,那么这个成本都体现在什么地方?如何计算? MySQL的成本 I/O成本 : 把数据从磁盘…

Python 萌新 - 花10分钟学爬虫

前言 Python 新手入门很多时候都会写个爬虫练手,本教程使用 Scrapy 框架,帮你简单快速实现爬虫,并将数据保存至数据库。在机器学习中数据挖掘也是十分重要的,我的数据科学老师曾经说过,好算法不如好数据。 Python助学…

理光打印机连接电脑后不打印的原因及解决方法

理光打印机在使用时,可能会出现正常连接上理光打印机却没有反应的情况,出现无法打印的情况,下面,驱动人生为大家带来理光打印机连接后不打印的解决方案。 驱动人生分析,一般遇到理光打印机连接后不打印的情况&#xf…