MySQL-数据操作类型的角度理解 S锁 X锁

文章目录

  • 1、S锁和S锁互相兼容
  • 2、S锁和X锁互斥
  • 3、X锁和X锁也互斥
  • 4、X锁和S锁也互斥
  • 5、select * from account for update;
  • 6、select * from account for update nowait;
  • 7、select * from account for update skip locked;

1、S锁和S锁互相兼容

在这里插入图片描述

2、S锁和X锁互斥

在这里插入图片描述

3、X锁和X锁也互斥

在这里插入图片描述

4、X锁和S锁也互斥

在这里插入图片描述

5、select * from account for update;

SELECT * FROM account FOR UPDATE; 是一个SQL语句,通常用于数据库管理系统(如Oracle, PostgreSQL, MySQL的InnoDB存储引擎等)中,用于锁定所选的行以供后续更新。

以下是这条语句的详细解释:

  1. SELECT * FROM account

    • 这部分是一个标准的SELECT语句,用于从account表中检索所有列和所有行。
  2. FOR UPDATE

    • 这是一个锁定子句,用于锁定所选的行。一旦这些行被锁定,其他事务就不能修改或删除它们,直到当前事务完成(提交或回滚)。
    • 这种锁定机制通常用于确保数据的一致性,特别是在涉及多个步骤的复杂事务中。
    • 注意:不同的数据库管理系统对FOR UPDATE的锁定行为和范围可能有不同的实现。例如,在某些系统中,它可能只锁定所查询的行(行级锁定),而在其他系统中,它可能锁定整个表(表级锁定)。

使用场景

假设你有一个在线银行系统,用户A正在尝试从他的账户中转账到用户B的账户。为了确保转账过程中账户余额的一致性,你可能需要执行以下步骤:

  1. 使用SELECT * FROM account WHERE id = A's_account_id FOR UPDATE;锁定用户A的账户。
  2. 检查用户A的账户余额是否足够进行转账。
  3. 如果余额足够,从用户A的账户中扣除相应金额,并增加用户B的账户余额。
  4. 提交事务,释放锁。

通过这种方式,你可以确保在用户A的账户被检查和更新之间,没有其他事务修改它,从而避免了潜在的数据不一致问题。

6、select * from account for update nowait;

SELECT * FROM account FOR UPDATE NOWAIT; 是一条SQL语句,通常用于数据库中的事务处理,特别是在需要锁定某些行以确保数据一致性的情况下。下面我会详细解释这条语句的每个部分:

  1. SELECT * FROM account

    • 这部分是一个标准的SELECT查询,它从account表中选择所有列(因为使用了*)。
  2. FOR UPDATE

    • FOR UPDATE是一个锁定子句,用于在事务中锁定选定的行。这意味着一旦某个事务执行了这个查询并锁定了某些行,其他尝试修改这些行的事务将被阻塞,直到第一个事务提交或回滚。
    • 这种锁定通常用于确保数据的完整性和一致性,尤其是在并发操作的环境中。
  3. NOWAIT

    • NOWAIT是一个与FOR UPDATE一起使用的选项。当指定了NOWAIT时,如果请求的行当前已被其他事务锁定,那么查询将立即返回一个错误,而不是等待其他事务释放锁。
    • 这对于不希望因为等待锁而被阻塞的应用程序来说是非常有用的。通过立即得到一个错误,应用程序可以决定如何响应(例如,重试、报告错误给用户等)。

示例场景

假设你有一个银行应用程序,两个用户(A和B)同时尝试从同一个账户(假设账户ID为123)中取款。为了避免出现“超支”的情况(即两个用户都成功取款,但账户余额不足以支付两次取款),数据库需要确保一次只有一个用户能够访问和修改该账户。

  • 用户A开始一个事务,并执行SELECT * FROM account WHERE id = 123 FOR UPDATE NOWAIT;。假设此时账户余额足够支付用户A的取款请求。
  • 在用户A的事务完成之前(即提交或回滚之前),用户B也尝试执行相同的查询。
  • 因为用户A的事务已经锁定了账户ID为123的行,并且由于使用了NOWAIT选项,所以用户B的查询将立即返回一个错误,而不是等待用户A的事务完成。
  • 用户B的应用程序可以捕获这个错误,并决定如何响应(例如,告诉用户B稍后再试)。

这样,通过使用FOR UPDATE NOWAIT,你可以确保数据的一致性和完整性,同时减少因为等待锁而导致的延迟和可能的死锁情况。
在这里插入图片描述

7、select * from account for update skip locked;

SELECT * FROM account FOR UPDATE SKIP LOCKED; 这条SQL语句在支持该语法的数据库中(如Oracle、PostgreSQL等)用于在尝试锁定表或表中的行时跳过已经被其他事务锁定的行。这允许查询快速返回一个结果集,其中只包含当前事务可以立即锁定的行,而忽略那些已被其他事务锁定的行。

这条语句通常用于高并发的数据库环境中,特别是当多个事务需要同时访问并更新相同的资源时。通过使用SKIP LOCKED选项,可以避免一个事务长时间等待另一个事务释放锁,从而提高整个系统的吞吐量和响应速度。

以下是这条语句的一些关键点:

  1. SELECT * FROM account:选择account表中的所有列。
  2. FOR UPDATE:指示数据库锁定所选的行,以便在后续的事务中更新它们。
  3. SKIP LOCKED:如果所选的行已被其他事务锁定,则跳过这些行并继续选择其他未被锁定的行。

示例场景

假设你有一个在线购物网站,并且多个用户同时尝试购买同一件商品(库存有限)。为了确保商品不会被超卖,每次购买时都需要锁定相应的库存记录并进行更新。

  • 用户A开始一个事务,并尝试锁定库存中数量大于0的商品。假设商品ID为123,当前库存为1。
  • 在用户A的事务完成之前(即提交或回滚之前),用户B也尝试购买同一件商品。
  • 由于用户A已经锁定了商品ID为123的记录,所以用户B的查询(使用FOR UPDATE SKIP LOCKED)将跳过已被锁定的记录,并继续查找其他未被锁定的商品。
  • 如果此时没有其他商品可购买,用户B的事务将不会等待用户A的事务完成,而是立即返回一个空的结果集或相应的错误消息。

通过使用FOR UPDATE SKIP LOCKED,你可以提高并发性能,避免不必要的等待,并为用户提供更快的响应速度。然而,请注意,这种机制并不能完全解决并发冲突,特别是在高并发的环境中。你可能还需要结合其他技术(如乐观锁、重试机制等)来确保数据的一致性和完整性。
在这里插入图片描述

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

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

相关文章

在线疫苗预约小程序的设计

管理员账户功能包括:系统首页,个人中心,工作人员管理,管理员管理,用户管理,疫苗管理,论坛管理,公告管理 微信端账号功能包括:系统首页,公告,疫苗…

K 近邻、K-NN 算法图文详解

1. 为什么学习KNN算法 KNN是监督学习分类算法,主要解决现实生活中分类问题。根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 KNN(K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

(1)Jupyter Notebook 下载及安装

目录 1. Jupyter Notebook是什么?2. Jupyter Notebook特征3. 应用3. 利用Google Colab安装Jupyter Notebook3.1 什么是 Colab?3.2 访问 Google Colab 1. Jupyter Notebook是什么? 百度百科: Jupyter Notebook(此前被称为 IPython …

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高,p先和 [] 结合说明p是一个数组,p先和*结合说明p是一个指针 括号保证p先和*结合,说明p是一个指针变量,然后指…

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接:使用ggplot绘制柱状图,在柱子中显示数值和显著性 本期教程 获得本期教程示例数据,后台回复关键词:20240628。(PS:在社群中,可获得往期和未来教程所有数据和代码) 往期教程…

Windows宝塔面板部署ThinkPHP8.0创建Vue项目案例

安装ThinkPHP8.0 登录宝塔面板,创建一个站点。 输入composer代码,执行完成后自动创建TP目录 composer create-project topthink/think tp 网站目录设置为tp,运行目录设置为public 设置PHP版本为8.0以上,不然会出现下面的报错代…

1-5题查询 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例题2.1.可回收且低脂的产品2.2.寻找用户推荐人2.3.大的国家2.4. 文章浏览 I2.5. 无效的推文 1. 相关知识点 sql判断,不包含null,判断不出来distinct是通过查询的结果来去除重复记录ASC升序计算字符长度 CHAR_LENGTH() 或 LENGTH(…

js实现blockly后台解释器,可以单步执行,可以调用c/c++函数

实现原理 解析blockly语法树,使用js管理状态,实际使用lua执行,c/c函数调用使用lua调用c/c函数的能力 可以单行执行 已实现if功能 TODO for循环功能 函数功能 单步执行效果图 直接执行效果图 源代码 //0 暂停 1 单步执行 2 断点 //创建…

[无广告!纯干货]免费用CodeFlying自动化生成一个专属的AI机器人

前言: 真心话,花3分钟看文章,再花5分钟体验,你会回来给我点赞的。 随着AIGC(人工智能生成内容)行业的迅猛发展,人工智能正在以前所未有的速度和方式改变我们的生活。 它不仅在娱乐、教育、医疗…

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式8275张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8275 标注数量(xml文件个数):8275 标注数量(txt文件个数):8275 标注…

汇聚荣拼多多电商好不好?

拼多多电商好不好?这是一个值得探讨的问题。拼多多作为中国领先的电商平台之一,以其独特的商业模式和创新的营销策略吸引了大量用户。然而,对于这个问题的回答并不是简单的好或不好,而是需要从多个方面进行综合分析。 一、商品质量 来看拼多…

ONLYOFFICE:开启高效办公新时代的全能利器

ONLYOFFICE官网链接:在线办公套件 | ONLYOFFICE 在线PDF查看器和转换器 | ONLYOFFICE 在数字化办公日益普及的今天,一款高效、易用、功能强大的办公软件成为了企业和个人不可或缺的得力助手。而ONLYOFFICE,正是这样一款集多种功能于一身的优…

Spring系统学习 - 基于注解管理Bean

什么是基于注解的方式管理Bean 在 Spring 框架中,基于注解的方式管理 Bean 是一种非常流行且现代的方法。它允许你通过在类、方法或字段上添加特定的注解来声明 Bean 的创建和依赖注入,从而避免了在 XML 配置文件中定义 Bean 的繁琐工作。 注解和 XML …

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": US…

Linux:系统安全及应用

目录 一、系统账号管理 1.1、系统账号清理 1.2、密码安全控制 1.3、命令历史限制 二、限制su命令用户 三、PAM安全认证 四、sudo机制提升权限 4.1、sudo机制介绍 4.2、用户别名案例 4.3、启用sudo操作日志 4.4、其他案列sudo 4.5、开关机安全控制 4.6、限制更改GR…

无线物联网练习题

文章目录 选择填空简答大题 选择 不属于物联网感知技术的是(A) A:ZigBee B:红外传感器 C:FRID D:传感器 ZigBee是一种无线通信技术,虽然它常用于物联网中作为设备之间的通信手段,但它本身并不是一种感知技术 关于物联网于与互联网的区别的描述&#xff…

昇思第6天

函数式自动微分 神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(loss function)获得loss,然后进行反向传播计算,求得梯度&#…

一站式uniapp优质源码项目模版交易平台的崛起与影响

一、引言 随着信息技术的飞速发展,软件源码已成为推动行业进步的重要力量。源码的获取、交易和流通,对于开发者、企业以及项目团队而言,具有极其重要的意义。为满足市场对高质量源码资源的迫切需求,一站式uniapp优质源码项目模版…

501、二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义&#xff1…