广告
返回顶部
首页 > 资讯 > 数据库 >【MySQL系列】- MYSQL锁机制
  • 171
分享到

【MySQL系列】- MYSQL锁机制

mysql数据库 2023-09-20 12:09:14 171人浏览 薄情痞子
摘要

【Mysql系列】- mysql锁机制 文章目录 【MySQL系列】- MYSQL锁机制一、表级锁表加读锁表独占锁释放锁 二、行级锁间隙锁(Gap Locks)临键锁(Next-key

Mysql系列】- mysql机制

文章目录


数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。

Mysql 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。

一、表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnDB、BDB等存储引擎中,对于表级锁一般分 1).表锁 2). 元数据锁 3). 意向锁。

表加读锁

lock tables 表名.. read; -- 是指可以对多张表加锁

表独占锁

lock tables 表名... write; -- 可以对多张表加独占锁

释放锁

unlock tables; -- 释放锁,客户端短裤连接

二、行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录的加锁。

对于行级锁,主要分为以下三类:

  1. 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
  2. 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
  3. 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

InnoDB实现了以下两种类型的行锁:

  1. 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
  2. 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
SQL行锁类型说明
INSERT…排他锁自动加锁
UPDATE…排他锁自动加锁
DELETE…排他锁自动加锁
SELECT…不加任何锁
SELECT… LOCK IN SHARE MODE共享锁手动加锁
SELECT…FOR UPDATE排他锁手动加锁

间隙锁(Gap Locks)

间隙锁是封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。

产生间隙锁的条件(RR事务隔离级别下;)

1). 使用普通索引锁定;2). 使用多列唯一索引;3). 使用唯一索引锁定多行记录。对于使用唯一索引来搜索并给某一行记录加锁的语句。只会产生记录锁,不会产生间隙锁。

打开间隙锁设置

查看是否启用间隙锁

show variables like 'innodb_locks_unsafe_for_binlog';

innodb_locks_unsafe_for_binlog默认值为OFF,既启用间隙锁。因为此参数是只读模式,如果想要禁用间隙锁,需要修改my.cnf 重启才能生效。

[mysqld]innodb_locks_unsafe_for_binlog = 1

结论

  1. 对于指定查询某一条记录的加锁语句,如果该记录不存在,会产生记录锁和间隙锁,如果记录存在,则会产生记录锁,如:WHERE Id=1 FOR UPDATE;
  2. 对于查找某一范围的查询语句,会产生间隙,如:WHERE ID BETWEEN 5 AND 7 FOR UPDATE;
  3. 在普通索引列上,不管是何种查询,只是加锁,都会产生间隙锁。

临键锁(Next-key Locks)

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。

临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。

三、页级锁

锁就是在 页的粒度 上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录。当我 们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页上的数据行。页锁的开销 介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间,并发度一般。

四、共享锁(S锁)

共享锁(Shared Lock),又称S锁、读锁。针对行锁。当有事务对数据加读锁后,其他事务只能对锁定的数据加读锁,不能加写锁(排他锁),所以其他事务只能读,不能写。

加锁方式:

select * from Table where id=2 lock in share mode;

释放方式:

commit 或 rollback;

五、排他锁(X锁)

X锁,英文为Exclusive Lock既为排他锁。也可以称为Write Lock;X锁是具有排他性。既一个写锁会阻止其他的X锁和S锁。当一个事务需要修改一条记录时,需要先获取该记录的X锁。

X锁加锁格式:

select ... for update;

六、死锁

由于Mysql有多种类型,在实际开发中可能产生死锁。

6.1 死锁的产生的原因

死锁是指两个或两个以上的进程在执行过程中,因资源的争夺造成的一种相互等待的现象。若无外来的作用,他们都将无法推进下去,此时的系统处于死锁状态或系统产生了死锁。

死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。

对应的解决死锁问题的关键就是:让不同的Session加锁有次序。

6.2 如何避免死锁

  • 以固定的顺序访问表和行。比如两个更新数据的事务,事务A更新数据的顺序为1,2;事务B更新数据顺序为:2,1;这样可能会造成死锁
  • 大事务拆小事务。大事务更倾向于死锁,如果业务运行,将大事务拆小。
  • 在同一个事务中,尽可能做到一次锁定所需所有资源,减少死锁概率。
  • 降低隔离级别。如果业务允许,将隔离级别调低也是比较好的选择,比如将隔离级别从RR调整为RC,可以避免很多原因gap锁造成的死锁。
  • 为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添加上锁,死锁的概率大大增加。

七、总结

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面带来了性能损耗可能比表锁会更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表锁的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势
但是,InnoDB的行级锁同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差

  1. 尽可能让所有数据检索都能通过索引来完成,避免无索引行锁升级为表锁
  2. 合理设计索引,尽量缩小锁的范围
  3. 尽可能减少索引条件及索引范围,避免间隙锁
  4. 尽量控制事务大小,减少锁定资源量和时间长度
  5. 尽可使用低级别事务隔离(需要业务层面满足需求)

来源地址:https://blog.csdn.net/songjianlong/article/details/132962707

您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL系列】- MYSQL锁机制

本文链接: https://www.lsjlt.com/news/412844.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【MySQL系列】- MYSQL锁机制
    【MySQL系列】- MYSQL锁机制 文章目录 【MySQL系列】- MYSQL锁机制一、表级锁表加读锁表独占锁释放锁 二、行级锁间隙锁(Gap Locks)临键锁(Next-key ...
    99+
    2023-09-20
    mysql 数据库
  • mysql系列(四)——mysql的锁
    一、...
    99+
    2020-10-04
    mysql系列(四)——mysql的锁
  • mysql的锁机制
    锁概述mysql锁机制的特点: 不同存储引擎支持不同的锁机制。MyISAM和MEMORY存储引擎支持表级锁;BDB存储引擎采用页面锁;InnoDB存储引擎支持行级锁。表级锁:开销小,加锁快,不会出现死锁,锁...
    99+
    2022-10-18
  • MySQL中的锁机制
    抛砖引玉:多个查询需要在同一时刻进行数据的修改,就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源,而相互不干扰。 写锁的排...
    99+
    2023-08-23
    mysql 数据库
  • MySQL锁机制详解
    SQL(锁机制)   锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。 加锁是消耗资源的,锁的各种操作...
    99+
    2015-10-14
    MySQL锁机制详解 数据库入门 数据库基础教程
  • mysql myisam的锁机制
    首先我们知道MySQL支持多种引擎,并且不同存储引擎有很多不同,最重要的 ...
    99+
    2022-10-18
  • mysql的锁机制详解
    这段时间一直在学习mysql数据库。项目组一直用的是oracle,所以对mysql的了解也不深。本文主要是对mysql锁的总结。 Mysql的锁主要分为3大类:    表级锁:存储引擎为Myisam。锁住整个表,特点是开销小,加锁快,锁定力...
    99+
    2021-08-13
    mysql的锁机制详解
  • 什么是MySQL锁机制
    本篇内容主要讲解“什么是MySQL锁机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是MySQL锁机制”吧!无论什么时候,只要存在多个连接在同一时刻修改数...
    99+
    2022-10-18
  • MySQL锁机制详解-表锁与行锁
    文章目录 1. 数据库锁理论2. 锁的分类2.1 按数据操作的类型分类2.2 按数据操作的颗粒度分类 3. 表锁的应用3.1 表锁相关命令3.2 给表加表共享读锁3.3 给表加表独占写锁...
    99+
    2023-09-11
    mysql 数据库
  • MySQL系列之十三 MySQL的复制
    目录一、MySQL复制相关概念二、简单的一主一从架构实现1、新数据库搭建主从架构2、旧数据库新加从服务器三、级联复制架构实现四、主主复制架构五、半同步复制的实现六、加密传输复制的实现...
    99+
    2022-11-12
  • MySQL的InnoDB锁机制介绍
    这篇文章主要介绍“MySQL的InnoDB锁机制介绍”,在日常操作中,相信很多人在MySQL的InnoDB锁机制介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL的...
    99+
    2022-10-18
  • MySQL锁机制有什么用
    这篇文章主要介绍了MySQL锁机制有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL的锁机制比较简单,其最显著的特点是不同的存...
    99+
    2022-10-18
  • MySQL中InnoDB锁机制分析
    本篇内容介绍了“MySQL中InnoDB锁机制分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • mysql锁表机制的概述
    这篇文章主要介绍“mysql锁表机制的概述”,在日常操作中,相信很多人在mysql锁表机制的概述问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql锁表机制的概述”的疑惑...
    99+
    2022-10-18
  • MySQL加锁机制是什么
    这篇文章主要介绍MySQL加锁机制是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在数据库中设计锁的目的是为了处理并发问题,在并发对资源进行访问时,数据库要合理控制对资源的访问规则。而锁就是用来实现这些访问规...
    99+
    2023-06-29
  • Mysql锁机制之行锁、表锁、死锁的实现
    目录一、Mysql锁是什么?锁有哪些类别?二、行锁和表锁的区别三、InnoDB死锁概念和死锁案例死锁场景一之select for update:死锁场景二之两个update...
    99+
    2022-11-13
  • MySQL的锁机制——记录锁、间隙锁、临键锁
    记录锁(Record Locks) 记录锁锁住的是索引记录,记录锁也叫行锁。如果使用索引作为条件命中了记录,那么就是记录锁,被锁住的记录不能被别的事务插入相同的索引键值,修改和删除。 例如: select * from test_...
    99+
    2023-08-18
    mysql 数据库 java
  • 【数据库】MySQL中的锁机制
    MySQL中的锁机制 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。 MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各...
    99+
    2023-08-18
    mysql 锁机制 共享锁 排它锁
  • mysql 锁机制与原理详解
    前言 不管是数据库,还是很多后端编程语言,都存在锁的机制,锁的存在有效解决了并发情况下对共同资源的抢占,保证了数据的稳定性和一致性,在mysql中,锁是如何工作的呢?其底层的工作原理是怎样的呢?本篇将详细介绍下mysql锁的机制。 mys...
    99+
    2023-09-16
    mysql 锁原理 mysql 锁机制 mysql 锁使用
  • mysql数据库中的锁机制
    这篇文章将为大家详细讲解有关mysql数据库中的锁机制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Mysql的锁主要分为3大类:表级锁:存储引擎为Myisam。锁住整个...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作