当前位置: 首页 > news >正文

【Mysql】-锁,行级锁

Mysql

mysql中的行锁

在 MySQL 的 InnoDB 存储引擎中,行级锁通常是加在索引上的,而不是直接加在数据行上。这种机制是基于索引的锁定策略,具体来说:

  1. 主键索引:如果查询更新使用了主键进行查找,InnoDB 会直接在主键索引上加锁。

  2. 唯一索引:如果查询更新使用了唯一索引(UNIQUE INDEX)进行查找,并且能够通过该唯一索引确定唯一的记录,那么 InnoDB 会在唯一索引上加锁。

  3. 非唯一索引:如果查询更新使用了非唯一索引进行查找,InnoDB 会在非唯一索引上加锁。但是,由于非唯一索引可能对应多条记录,InnoDB 还需要在这些记录的聚簇索引(通常是主键索引)上加锁以确保数据的一致性。

  4. 无索引:如果查询更新没有使用任何索引(例如全表扫描),InnoDB 会在聚簇索引(通常是主键索引)的所有记录上加锁。

具体示例

假设有一个表 users,其结构如下:

Sql

CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR(255) UNIQUE,email VARCHAR(255)
);
  • 如果执行以下查询:

    Sql
    SELECT * FROM users WHERE id = 1 FOR UPDATE;

    InnoDB 会在 id 索引(即主键索引)上加锁。

  • 如果执行以下查询:

    Sql
    SELECT * FROM users WHERE username = 'john_doe' FOR UPDATE;

    InnoDB 会在 username 索引(即唯一索引)上加锁。

  • 如果执行以下查询:

    Sql
    SELECT * FROM users WHERE email = 'john@example.com' FOR UPDATE;

    假设 email 没有索引,InnoDB 将执行全表扫描并在所有记录的主键索引上加锁。

总结

行级锁通常不是直接加在数据行上的,而是加在与数据行相关的索引项上。这是因为索引提供了快速定位数据的方式,同时也可以高效地管理锁。通过这种方式,InnoDB 可以最小化锁的影响范围,提高并发性能。如果你希望避免不必要的锁,确保你的查询尽可能使用合适的索引是非常重要的。

*** Mysql IX IS锁是表级锁,如果表中有数据行索引加了索引行锁x s 锁 就会在表上加上iX 或 IS 表明 表内部的数据正被加锁了

Oracle

在 Oracle 数据库中,行级锁是直接加在数据行上的,而不是索引上。Oracle 使用一种称为“多版本并发控制”(Multiversion Concurrency Control, MVCC)的技术来管理事务和锁,这与 MySQL 的 InnoDB 存储引擎有一些相似之处,但实现细节有所不同。

Oracle 中的行级锁

  • 锁定机制:当一个事务修改某一行时,Oracle 会在该行上放置一个排他锁(Exclusive Lock)。这个锁确保了在同一时间只有一个事务可以修改这一行。

  • 索引的作用:虽然锁是直接放在数据行上的,但索引对于快速定位需要锁定的行非常重要。通过索引,Oracle 可以迅速找到并锁定相关的数据行,而不需要进行全表扫描。

  • 锁定粒度:Oracle 的行级锁只锁定被修改的行,这样可以最大限度地减少对其他事务的影响,并提高并发性能。

锁模式

Oracle 提供了几种不同的锁模式,包括:

  • 共享锁 (S Lock):允许多个事务读取同一行,但阻止任何事务对其进行修改。
  • 排他锁 (X Lock):允许一个事务独占访问某一行,阻止其他事务对该行进行读取或修改。
  • 行级共享锁 (Row Share Lock, RS Lock):允许其他事务获取行级共享锁或读取该行,但阻止其他事务获取排他锁。
  • 行级排他锁 (Row Exclusive Lock, RX Lock):允许其他事务读取该行,但阻止其他事务获取任何类型的写锁。

示例

假设有一个表 employees,其结构如下:

Sql

CREATE TABLE employees (id NUMBER PRIMARY KEY,name VARCHAR2(100),salary NUMBER
);
  • 如果执行以下更新语句:

    Sql
    UPDATE employees SET salary = 50000 WHERE id = 1;

    Oracle 会在 id = 1 的那条记录上放置一个排他锁。

  • 如果执行以下查询语句(使用 FOR UPDATE 子句):

    Sql

    SELECT * FROM employees WHERE id = 1 FOR UPDATE;

    Oracle 也会在 id = 1 的那条记录上放置一个排他锁,防止其他事务修改这条记录。

总结

在 Oracle 中,行级锁是直接加在数据行上的,而不是索引上。索引用于快速定位需要锁定的行,但实际的锁是加在数据行上的。这种设计使得 Oracle 能够高效地管理并发访问,同时保证数据的一致性和隔离性。

相关文章:

【Mysql】-锁,行级锁

Mysql mysql中的行锁 在 MySQL 的 InnoDB 存储引擎中,行级锁通常是加在索引上的,而不是直接加在数据行上。这种机制是基于索引的锁定策略,具体来说: 主键索引:如果查询更新使用了主键进行查找,InnoDB 会直…...

手机功耗技术领域

手机功耗技术领域 器件 器件-电池 提升电池能量密度 提升正极电压、升级负极材料正极电压方面,目前行业还是以4.5V体系为主;4.53V体系预计24-25年落地;负极材料方面,石墨体系每年2%能量密度提升迭代; 掺硅方案目前…...

Golang | Leetcode Golang题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; type fenwick struct {tree []int }func newFenwickTree(n int) fenwick {return fenwick{make([]int, n1)} }func (f fenwick) add(i int) {for ; i < len(f.tree); i i & -i {f.tree[i]} }func (f fenwick) sum(i int) (res int)…...

linux笔记(yum本地源仓库搭建)

一、准备工作 安装必要的软件包 在大多数 Linux 发行版中&#xff0c;Yum 已经默认安装。如果系统中没有安装&#xff0c;可以根据发行版的包管理器进行安装。 准备本地源文件 可以是光盘镜像&#xff08;如果是从光盘安装系统&#xff09;&#xff0c;或者是已经下载好的系…...

K8S系列-Kubernetes网络

一、Kubernetes网络模型 ​ Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中&#xff0c;不管它们是否运行在同一个Node&#xff08;宿主机&#xff09;中&#xff0c;都…...

Excel 对数据进行脱敏

身份证号脱敏&#xff1a;LEFT(A2,6)&REPT("*",6)&RIGHT(A2,6) 手机号脱敏&#xff1a;LEFT(B2,3)&REPT("*",5)&RIGHT(B2,3) 姓名脱敏&#xff1a;LEFT(C2,1)&REPT("*",1)&RIGHT(C2,1) 参考&#xff1a; excel匹配替换…...

OJ-1014田忌赛马

示例1&#xff1a; 输入 11 8 20 10 13 7 输出 1 示例2&#xff1a; 输入 11 12 20 10 13 7 输出 2 示例3&#xff1a; 输入 1 2 3 4 5 6 输出 6 解题思路&#xff1a; 问题的关键在于调整数组a的顺序,使得尽可能多的a[i] > b[i]。为了达到最优结果,我们可以采用贪心的策…...

Excel重新踩坑3:条件格式;基本公式运算符;公式中的单元格引用方式;公式菜单栏其他有用的功能说明;

0、前言&#xff1a;以下内容是学习excel公式的基础内容。 1、需求&#xff1a;将表格特定区域中数值大小大于等于30&#xff0c;小于等于80的单元格&#xff0c;颜色填充为红色&#xff0c;大于80的&#xff0c;颜色填充为黄色。 新建规则之后也可以通过该功能清除规则。 2、基…...

【AI知识点】FAISS如何提高检索效率?

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】 FAISS&#xff08;Facebook AI Similarity Search&#xff09; 是一个高效的相似度搜索库&#xff0c;专门设计用于处理大规模的向量检索任务&#xff0c;尤其是在稠密向量的检索中表现出色。FAISS 能够显著提高检索效率…...

【Git】Gitlab进行merge request的时候,出现待合并分支合并了主分支的问题的解决

最近在公司开始用merge request进行代码合并了。 然后不知道为啥&#xff0c;如果待合并分支&#xff08;A&#xff09;进行merge request到主分支&#xff08;B&#xff09;的时候&#xff0c;如果A和B有冲突&#xff0c;然后我在gitlab上使用页面进行冲突的解决&#xff0c;比…...

jetson nano ubuntu20.04安装ros-Noetic

jetson nano ubuntu20.04 安装ros-Noetic 一. 初始准备nano连接wifinano网络配置二. 查看系统版本三. 开始安装1. 移除不需要的 amd64 架构2. 配置软件源3.安装 ROS Melodic`4. 解决 rosdep update报错`一. 初始准备 nano连接wifi nano网络配置 二. 查看系统版本 lsb_relea…...

【数据结构与算法】走进数据结构的“时间胶囊”——栈

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.栈的基本概念 1.1 定义 1.2 特性 1.3 基本操作 二.栈的实现方式 2.1 顺序栈 2.2 链栈 三.顺序栈的实现 定义顺序栈的结构 初始化 入栈 检查栈是否为空 出栈 销毁 四.链栈的实现 定义链栈的结构 初始…...

伺服增量式和绝对式的本质区别?

伺服增量式和绝对式的本质区别&#xff1f; 增量式编码器是将位移转换成周期性的电信号&#xff0c;再把这个电信号转变成计数脉冲&#xff0c;用脉冲的个数表示位移的大小。以转动时输出脉冲&#xff0c;通过计数设备来知道其位置&#xff0c;当编码器不动或停电时&#xff0c…...

应对 .DevicData-X-XXXXXXXX 勒索病毒:防御与恢复策略

引言 随着信息技术的快速发展&#xff0c;网络安全问题愈发严峻。勒索病毒作为一种恶性网络攻击手段&#xff0c;已成为企业和个人面临的重大威胁之一。尤其是 .DevicData-X-XXXXXXXX 勒索病毒&#xff0c;其通过加密用户数据并勒索赎金&#xff0c;给受害者带来了巨大的经济损…...

【代码随想录——数组——二刷】

数组 1. 二分查找(704) 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 1.1 二分法的第一种写法 我们定义 target 是在…...

spring-boot(4)

1.VueRouter安装与使用 2.状态管理VueX 3. 4. 5. 6....

深度学习模型:原理、架构与应用

深度学习(Deep Learning)是机器学习中的一个分支,基于人工神经网络的发展,尤其是多层神经网络的研究,使其在语音识别、图像处理、自然语言处理等领域取得了显著进展。深度学习的核心是通过大量数据的训练,学习到数据的内在结构和模式,并且具备自动从复杂的输入中提取特征…...

玩客云Armbian安装Casaos

#armbian安装docker apt install docker.io #armbian判断docker是否正常运行 systemctl status docker #查看版本 docker version #安装casaos方式一 wget -qO- https://get.casaos.io | bash #安装casaos方式二 curl -fsSL https://get.casaos.io | bash...

redis过期提醒

文章目录 redis过期提醒 redis过期提醒 有一次看redis的配置文件发现一个notify-keyspace-events配置&#xff0c;注释里边长篇大论的&#xff0c;那我得看看这是干啥的&#xff0c;看完注释内容&#xff0c;发现不得了了&#xff0c;redis竟然还有过期提醒的功能 接下来得大…...

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代&#xff0c;网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行&#xff0c;还是对外提供服务&#xff0c;网络都发挥着关键作用。对于网络工程师或IT运维人员…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...