MYSQL之锁机制

news/2024/9/25 10:32:15/

什么是锁机制?

MySQL的锁机制是数据库中用于管理和控制对共享资源并发访问的一种机制。在多用户环境下,不同的用户可能同时对同一数据进行读写操作,如果没有适当的锁机制,就可能出现数据不一致或脏读等问题。

锁分类

1.从数据库的操作类型上分:

  • 读锁(共享锁,S锁(Shared)):):针对同一份数据,多个读操作可以同时进行而不会互相影响
  • 写锁(排它锁,X锁(eXclusive)):当前写操作没有完成前,它会阻断其他写锁和读锁,数据修改操作都会加写锁,查询也可以通过for update加写锁
  • 意向锁(Intention Lock):又称I锁,针对表锁,主要是为了提高加表锁的效率,是mysql数据库自己加的。当有事务给表的数据行加了共享锁或排他锁,同时会给表设置一个标识,代表已经有行锁了,其他事务要想对表加表锁时,就不必逐行判断有没有行锁可能跟表锁冲突了,直接读这个标识就可以确定自己该不该加表锁。特别是表中的记录很多时,逐行判断加表锁的方式效率很低。而这个标识就是意向锁。

    意向锁主要分为:

    意向共享锁,IS锁,对整个表加共享锁之前,需要先获取到意向共享锁。

    意向排他锁,IX锁,对整个表加排他锁之前,需要先获取到意向排他锁。

2.从粒度上分: 

  • 行锁:每次只锁住一行记录开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高

InnoDB相对于MYISAM的最大不同有两点:

  • InnoDB支持事务(TRANSACTION)
  • InnoDB支持行级锁

注意,InnoDB的行锁实际上是针对索引加的锁(在索引对应的索引项上做标记),不是针对整个行记录加的锁。并且该索引不能失效,否则会从行锁升级为表锁。(RR级别会升级为表锁,RC级别不会升级为表锁)

  • 页锁:锁住一整页,通常是16kb,是innodb所特有的。锁定的数据资源比行锁要多,因为一个页中可以有多个行记录。当我们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页上的数据行。页锁的开销介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间,并发度一般。
  • 表锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。
  • 间隙锁

间隙锁,锁的就是两个值之间的空隙,间隙锁是在可重复读隔离级别下才会生效。

上节课讲过,Mysql默认级别是repeatable-read,有幻读问题,间隙锁是可以解决幻读问题的。

假设account表里数据如下:

那么间隙就有 id 为 (3,10),(10,20),(20,正无穷) 这三个区间,在Session_1下面执行如下sql:

select * from account where id = 18 for update;

则其他Session没法在这个(10,20)这个间隙范围里插入任何数据。

  • 临键锁(Next-key Locks)

Next-Key Locks是行锁与间隙锁的组合。

3.从性能上分

乐观锁(用版本对比或CAS机制)和悲观锁,乐观锁适合读操作较多的场景,悲观锁适合写操作较多的场景,如果在写操作较多的场景使用乐观锁会导致比对次数过多,影响性能

总结

锁机制对于维护数据库的ACID特性(原子性、一致性、隔离性、持久性)至关重要。正确地使用锁可以提高数据库的并发性能,但不当的锁使用也可能导致性能下降或死锁。因此,理解和合理地应用MySQL的锁机制对于我们开发者来说非常重要。


http://www.ppmy.cn/news/1438336.html

相关文章

设计模式- 中介者模式(Mediator)

1. 概念 中介者模式(Mediator Pattern),是一种对象行为型模式。该模式的主要目的是定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合变得松散,并且可以独立地改变它们之间的交互。 2. 原理结构图 抽…

XiaodiSec day019 Learn Note 小迪安全学习笔记

XiaodiSec day019 Learn Note 小迪安全学习笔记 记录得比较凌乱,不尽详细 C#相关 .NET 框架,多用 C#开发 内容非常少,和通用安全漏洞差不多 未授权访问 目录结构 反编译获得源码,dll 反编译 web.config 目录 dll 文件类似于…

Java -- (part15)

一.数学相关类 Math 1.概述:数学工具类 2.特点 a.构造私有 b.方法静态 3.使用:类名直接调用 4.方法 static int abs(int a)->求参数的绝对值 static double ceil(double a)->向上取整 static double floor(double a)->向下取整 static long round(double a…

设计模式- 享元模式(Flyweight Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

美国站群服务器如何解决跨国运营中的网络延迟问题?

美国站群服务器如何解决跨国运营中的网络延迟问题? 在当今全球化的商业环境中,跨国企业面临的一个重要挑战是网络延迟问题。网络延迟不仅影响用户体验,还可能导致交易失败或数据传输错误,对企业造成不利影响。然而,利用美国站群…

Docker常用操作记录

docker 常用命令 // 查看docker系统信息 docker info // 显示 Docker 版本信息 docker version docker ps // 查看正在运行的容器 docker ps -a // 查看所有已经创建的容器 docker images // 列出镜像列表 docker container ls // 效果同ps命令(加-a效果同)// 详细信息 docke…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁? A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点:网络安全 解析:(B) 钓鱼攻击通常被认为是应用层的安全威胁,也有在网络层进行伪装实施钓鱼攻击,…

前端发送请求之fetch跟axios的区别

前端开发工程师在针对页面UI设计稿还原之后,还需要与后端开发工程师进行接口对接,发送请求获取后端接口数据后进行逻辑处理呈现给用户。 常见的发送请求的方式是:Fecth,Axios 以下概念来自AI Fecth与Axios的区别: AP…