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.mfbz.cn/a/762334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLaVA1.5训练数据和时间分析

LLaVA的PT+SFT训练_llava sft-CSDN博客文章浏览阅读379次。这个阶段,使用8个A100(80G)训练LLaVA-v1.5-13B大约需要20h。全量微调,非lora跑不起来啊,以前一直用swift,llama-factory这种框架式的代码库,但用原作者开源的代码也是有很多好处的。在这个阶段,使用 8 个 A100(…

App测试技术(纯理论)

之前我们也学习过一些普通用例的设计, 如功能, 性能, 安全性, 兼容性, 易用性, 界面的测试用例设计, 之前我们讲的基本都是对于Web应用而言的, 这里我们来讲一下移动端的App测试用例设计. 功能方面 安装&卸载测试 这是只属于App的一类测试, 再平常我们使用移动设备(手机…

nodejs--【Express基本使用】

10 【Express基本使用】 https://www.expressjs.com.cn/ 基于 Node.js 平台,快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目,在安装npm之前可先安装淘宝镜像: npm install -g cnpm -…

[工业网络][2] 安全背景知识

安全背景知识 物理、网络和人员安全 在考虑企业和工业的安全性时,安全从业人员传统上将自己划分为三个专业领域。我们借助于安全中经常使用的两个术语来描述这三个领域 业内人士。属于您的设施的人员,包括员工和受邀承包商,访客或交付和服…

Skipfish一键扫描网站漏洞(KALI工具系列三十四)

目录 1、KALI LINUX 简介 2、Skipfish工具简介 3、信息收集 3.1 目标IP 3.2 kali的IP 4、操作步骤 4.1创建目录 4.2开始扫描 4.3 配置扫描 4.4 指定范围 4.5 查看扫描结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版 &#xf…

TopK问题与如何在有限内存找出前几最大(小)项(纯c语言版)

目录 0.前言 1.知识准备 2.实现 1.首先是必要的HeapSort 2.造数据 其他注意事项 3.TopK的实现 0.前言 在我们的日常生活中总有排名系统,找出前第k个分数最高的人,而现在让我们用堆来在有限内存中进行实现 1.知识准备 想要实现topk问题首先我们要…

windows下启动redisSentinel

如果已经安装redis的就继续往下看&#xff0c;还没安装redis&#xff0c;先安装一下redis 安装完redis之后&#xff0c;打开redis的目录。 新建一个sentinel.conf文件 # 端口号 port 26379# Sentinel 监控的主节点信息&#xff0c;格式为 <master-name> <ip> &l…

Spring Cloud Sentinel

官网代码案例: 注意&#xff1a; 1. 引入依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 2. 配置文件application.yml spring:cloud:sent…

海康视频播放,包含h5和web插件

自行下载 海康开放平台 demo 都写得很清楚&#xff0c;不多描述 1.视频web插件 vue2写法&#xff0c;公共vue文件写法&#xff0c;调用文件即可 开始时需要以下配置&#xff0c;不知道的找对接平台数据的人&#xff0c;必须要&#xff0c;否则播不了 getParameterData: {po…

4.Android逆向协议-详解二次打包失败解决方案

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;3.Android逆向协议-APP反反编译及回编译 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数&#xff08;响应式编程&#xff09; 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前&#xff0c;我们先理解一些相关的…

前端学习笔记(2406261):jquery使用checkbox控制页面自动刷新

文章目录 需求登录页面主页面 API用户登录login获取数据getdata 代码登录页面主页面 关于后端 需求 这是一个物联网的演示项目&#xff0c;web端能够实时显示后台数据的变化&#xff0c;其流程非常简单&#xff1a; 用户登录登录成功后显示主界面面主界面进入后自动显示数据数…

为什么网络爬虫广泛使用HTTP代理?

一、引言 网络爬虫作为自动抓取互联网信息的重要工具&#xff0c;在现代社会中发挥着不可或缺的作用。然而随着网络环境的日益复杂&#xff0c;网站反爬虫技术的不断进步&#xff0c;网络爬虫在获取数据的过程中面临着越来越多的挑战。为了应对这些挑战&#xff0c;HTTP 代理成…

已解决 SyntaxError: invalid syntax,Python报错原因和解决方案。

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这篇文章带大家…

创建一个Django用户认证系统

目录 1、Django2、Django用户认证系统User 模型&#xff1a;Authentication 视图&#xff1a;认证后端 (Authentication Backends)&#xff1a;Form 类&#xff1a;中间件 (Middleware)&#xff1a;权限和组 (Permissions and Groups)&#xff1a; 3、创建一个django用户认证系…

科普文:一文搞懂jvm原理(二)类加载器

概叙 科普文&#xff1a;一文搞懂jvm(一)jvm概叙-CSDN博客 前面我们介绍了jvm&#xff0c;jvm主要包括两个子系统和两个组件&#xff1a; Class loader(类装载器) 子系统&#xff0c;Execution engine(执行引擎) 子系统&#xff1b;Runtime data area (运行时数据区域)组件&am…

“一带一路”再奏强音!秘鲁总统博鲁阿尔特参访苏州金龙

6月27日下午&#xff0c;首次访华的秘鲁共和国总统博鲁阿尔特一行到苏州金龙参观访问&#xff0c;受到了苏州金龙总经理黄书平的热情接待。 黄书平&#xff08;左二&#xff09;向博鲁阿尔特&#xff08;右一&#xff09;介绍苏州金龙发展情况 从苏州金龙发展历程、产品技术研…

【UE5.1】Chaos物理系统基础——02 场系统的应用

目录 步骤 一、运用临时场&#xff08;外部张力&#xff09;破裂几何体集 二、使用构造场固定几何体集 步骤 在上一篇中&#xff08;【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体&#xff09;我们已经创建了可被破碎的几何体集&#xff0c;在最后我们防止几何体集…

基于K线最短路径构造的非流动性因子

下载地址https://download.csdn.net/download/SuiZuoZhuLiu/89492221

暴雨来袭,陈赫家变“水帘洞”网友:赫哥滴滴打船吗?

在魔都上海&#xff0c;一场突如其来的暴雨 不仅让街道变成了河流&#xff0c;还悄悄上演了一场现实版的“水帘洞”奇遇 而这场奇遇的主角&#xff0c;竟然是喜剧界的明星——陈赫&#xff01; 这天&#xff0c;乌云密布&#xff0c;电闪雷鸣 魔都的天空仿佛被捅了个窟窿 雨…