【MySQL 流浪之旅】 第六讲 浅谈 MySQL 锁

系列文章目录

【MySQL 流浪之旅】 第一讲 MySQL 安装
【MySQL 流浪之旅】 第二讲 MySQL 基础操作
【MySQL 流浪之旅】 第三讲 MySQL 基本工具
【MySQL 流浪之旅】 第四讲 MySQL 逻辑备份
【MySQL 流浪之旅】 第五讲 数据库设计的三个范式


目录

系列文章目录

一、什么是锁?

二、锁的类型?

三、锁的算法?

四、锁与事务隔离级别

4.1. 隔离级别简介

4.2. Read Uncommitted(读取未提交内容)

4.3. Read Committed(读取提交内容) 

4.4. Repeatable Read(可重读)

4.5. Serializable(可串行化)

五、死锁


一、什么是锁?

锁是实现事务隔离性最广泛使用的技术。以 MySQL InnoDB 为例,数据库的锁有排他锁,共享锁,意向锁,自增锁,间隙锁。

按照粒度分为锁定整个表的表级锁(table-level locking)和锁定数据行的行级锁(row-level locking):

  • 表级锁具有开销小、加锁快的特性;但是表级锁的锁定粒度较大,发生锁冲突的概率高,支持的并发度低;
  • 行级锁具有开销大,加锁慢的特性;但是行级锁的锁定粒度较小,发生锁冲突的概率低,支持的并发度高。

InnoDB 存储引擎同时支持行级锁(row-level locking)和表级锁(table-level locking),默认情况下采用行级锁。
InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。所以如果访问没有命中索引,就无法使用行锁,将要退化为表锁(共享行锁上升为共享表锁,排他行锁上升为排他表锁)。

二、锁的类型?

InnoDB存储引擎实现的是行级锁

  • 共享锁(S Lock):允许事务读一行数据
  • 排他锁(X Lock):允许事务删除或更新一行数据

排他锁和共享锁的兼容性

 

  • 意向共享锁(IS Lock):事务想要获得一张表中某几行的共享锁
  • 意向排他锁(IX Lock):事务想要获得一张表中某几行的排他锁

 意向排他锁和意向共享锁的兼容性

  • 间隙锁:where条件是一个范围时,数据库会锁定区间数据,主要是解决幻读问题。 
  • 自增锁:自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。控制同一sql 语句插入的所有记录的自增id是连续的。

平时还有提到的悲观锁,乐观锁,在数据库层面上没有这个锁的概念,如果要做简单映射,悲观锁可以映射成排他锁,乐观锁是由应用层面保障的,和 DB 的锁概念无关。

  • 乐观锁:认为冲突概率低,操作数据时,不会锁定数据,只有在提交修改时,才检查。如果数据已被修改,则回滚,否则提交。 
  • 悲观锁:一种并发控制方法。认为冲突概率高,每次读写前都加锁。

所以我们说,锁的分类从不同角度来看有不同的类型:

三、锁的算法?

  • Record Lock:单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,但不包含基本本身
  • Next-key Lock:Gap Lock + Record Lock:锁定一个范围,并且锁定记录本身 

四、锁与事务隔离级别

4.1. 隔离级别简介

事务的隔离级别是用来描述并发控制机制中不同事务之间隔离程度的参数。以下是几种常见的隔离级别及其特点:

  • Read Uncommitted(读取未提交内容)
  • Read Committed(读取提交内容)
  • Repeatable Read(可重读)
  • Serializable(可串行化)
事务隔离级别脏读不可重复读幻读
Read Uncommitted(读取未提交内容)
Read Committed(读取提交内容)
Repeatable Read(可重读)
Serializable(可串行化)

4.2. Read Uncommitted(读取未提交内容)

定义:所有事务都可以看到其他未提交事务的执行结果。(本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少)读取未提交的内容也称为脏读,所以在该隔离级别下是存在脏读这种缺陷的。在该隔离级别是允许脏读。

锁的状态:Read Uncommitted这个隔离级别是不加锁的,所有的事物都能任意操作数据,数据是没有任何一致性可言,其实数据就是处于混乱的状态中。

图示

图中所示,会导致什么问题呢?

tab2在B时刻查询到了表的数据,但是如果在C时刻发生了回滚,那么tab1的数据的插入不成功的,其实这时表里是没有数据的,但是事务tab2却查询到了数据,这就导致数据不一致了。

4.3. Read Committed(读取提交内容) 

定义:只能读取到已经提交的数据,这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 会出现所谓的不可重复读(Nonrepeatable Read)这种缺陷,因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

锁的状态:该隔离级别下,数据的读取都是不加锁的,但是事务的写入、修改、删除是加锁的。

4.4. Repeatable Read(可重读)

定义:这是MySQL的默认事务隔离级别,他确保一事务的多个会话在并发读取数据时,会看到同样的数据行。

T1

T2

T3

begin;

begin;

begin;

root@localhost> select id,class_name,teacher_id from class_teacher;

+----+--------------+------------+

| id | class_name   | teacher_id |

+----+--------------+------------+

|  1 | 初三一班     |          1|

|  2 | 初三二班     |         1 |

+----+--------------+------------+

2 rows in set (0.00 sec)

update class_teacher set class_name='初三三班' where id=1;

Waiting……

root@localhost> select id,class_name,teacher_id from class_teacher;

+----+--------------+------------+

| id | class_name   | teacher_id |

+----+--------------+------------+

|  1 | 初三一班     |          1|

|  2| 初三二班     |         1 |

+----+--------------+------------+

2 rows in set (0.00 sec)

insert into class_teacher values (null,'初三三班',1);

commit;

root@localhost> select id,class_name,teacher_id from class_teacher;

+----+--------------+------------+

| id | class_name   | teacher_id |

+----+--------------+------------+

|  1 | 初三一班     |          1|

|  2 | 初三二班     |         1 |

|  3 | 初三三班     |         1 |

+----+--------------+------------+

3 rows in set (0.00 sec)

从上图可以看出,传统的Repeatable Read(可重读),为了保证可重读,读取出来的数据行是加锁的,所以这些行在commit(锁释放)前是不能修改的,但是他不会对新插入的行加锁,所以T3是可以插入数据的,并且再次查询的时候就会看到新插入的的行,这种现象就是幻读。

4.5. Serializable(可串行化)

定义:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁(每次读都需要获得表级共享锁)。在这个级别,可能导致大量的超时现象和锁竞争,读写相互都会阻塞。因此,会导致大量的超时现象。

锁的状态:MySQL从MVCC并发控制退化为基于锁的并发控制。不区别快照读与当前读,所有的读操作均为当前读,读加读锁 (S锁),写加写锁 (X锁)。Serializable隔离级别下,读写冲突,因此并发度急剧下降,在MySQL/InnoDB下不建议使用。

五、死锁

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

show engine innodb status查看死锁信息

死锁通常包括以下四个必要条件:

  1. 互斥条件(Mutual Exclusion):每个资源只能同时被一个线程占用。如果一个线程占用了某个资源,其他线程就无法同时占用它。
  2. 请求与保持条件(Hold and Wait):线程在持有某些资源的同时,又请求其他资源。如果线程在等待其他资源时不释放已占用的资源,就可能导致死锁。
  3. 不可剥夺条件(No Preemption):系统不能抢占线程占用的资源,只能由线程自愿释放。
  4. 循环等待条件(Circular Wait):多个线程之间形成一个环形等待其他线程释放资源的情况。 

为了预防和解决死锁问题,可以采取以下策略:

  1. 加强互斥条件:尽量减少共享资源的互斥性,或者使用更高级的同步机制来替代基本的互斥锁。
  2. 加强请求与保持条件:要求数资源时,尽量一次性请求所有需要的资源,而不是逐个请求。
  3. 加强不可剥夺条件:允许操作系统抢占线程占用的资源,以避免某些线程长时间占用资源而导致死锁。
  4. 加强循环等待条件:引入资源分配图,检测潜在的死锁情况,然后采取措施来打破等待环路。
  5. 使用超时:线程在等待资源时,设置一个超时时间,超时后可以放弃等待或者重试。
  6. 使用死锁检测和恢复机制:系统可以定期检测死锁,并采取措施来解除死锁,如终止某些线程或回滚操作。

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

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

相关文章

07-Nacos-接入Mysql实现持久化

1、默认内嵌的数据库 Derby 存于/data目录 2、扩展仅支持Mysql 5.6.5 执行Nacos中的SQL脚本,该脚本是Nacos-server文件夹中的nacos-mysql.sql 详见 01-Nacos源码打包、部署-CSDN博客 3、修改配置文件 Nacos-server中的conf目录下,application.proper…

5种ai智能自动写作,让你的写作效率秒拔高

写作是一项需要耗费大量时间和精力的任务,但现在有了AI智能自动写作软件,我们可以轻松提高写作效率。在国内市场上,有许多优秀的写作软件可供选择。本文将向您推荐5款国内的写作软件,并详细说明每款软件的功能特点。 爱制作AI 使…

小项目:使用MQTT上传温湿度到Onenet服务器

前言 我们之前分别编写了 DHT11、ESP8266 和 MQTT 的代码,现在我们将它们仨整合在一起,来做一个温湿度检测小项目。这个项目可以实时地将 DHT11 传感器获取到的温湿度数据上传到 OneNET 平台。通过登录 OneNET,我们随时随地可以查看温湿度数…

山体滑坡在线安全监测预警系统(解决方案)

在近年来,随着全球气候变化的影响,山体滑坡等自然灾害频发,给人们的生命财产安全带来了严重威胁。为了有效预防和减少山体滑坡带来的危害,许多地方开始在山上安装山体滑坡在线安全监测预警系统(解决方案)。…

Java版大厂算法题1——数字颠倒

问题描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出&#xff0c;程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0。如果输入为100&#xff0c;则输出为001。 数据范围&#xff1a;0<n<(2^30)-1 * 输入描述&#xff1a;输入…

SpringBoot+SqlServer查询接口

SpringBootSqlServer查询接口 文章目录 SpringBootSqlServer查询接口1. pom环境配置2. common工具包3. 实体类接口映射4. Service层Controller层 需求&#xff1a;根据站号查询前一个小时的所有数据&#xff0c;将数据返回格式为Map<String,List<Map<String,String>…

【硬件产品经理】避免硬件产品失败 | 技术维度

目录 简介 技术维度一&#xff1a;低估产品开发 技术维度二&#xff1a;低估规模生产的复杂性 技术维度三&#xff1a;测试不足 技术维度四&#xff1a;产品太复杂 技术维度五&#xff1a;对客户承诺太高 推荐内容 简介 这节内容主要从技术维度来谈谈避免硬件产品失败这…

vue3封装el-pagination分页组件

1、效果如图&#xff1a; 2、分页组件代码&#xff1a; <template><div class"paging"><el-config-provider :locale"zhCn"><el-paginationv-model:current-page"page.currentPage"v-model:page-size"page.pageSize…

基于Prompt Learning的信息抽取

PTR: Prompt Tuning with Rules for Text Classification 清华&#xff1b;liuzhiyuan&#xff1b;通过规则制定subpromptRelation Extraction as Open-book Examination: Retrieval-enhanced Prompt Tuning Relation Extraction as Open-book Examination: Retrieval-enhance…

iPhone 14支持NFC吗?如果支持,那么怎么启用

你准备好通过启用NFC来释放iPhone 14的全部潜力了吗&#xff1f;如果你曾经想知道如何在你的设备上利用NFC&#xff0c;那么你就来对地方了。 在本综合指南中&#xff0c;我们将引导你完成在iPhone 14上激活NFC的步骤&#xff0c;使你能够无缝连接其他设备&#xff0c;进行非接…

github添加 SSH 密钥

1 打开终端 输入 ssh-keygen -t rsa -b 4096 -C "github邮箱地址"如果不需要密码可以一路回车 出现这个页面就是生存成功了 open ~/.ssh // 打开.ssh 找到id_rsa.pub复制出内容新建ssh密钥输入内容,保存即可

网络安全|重大失误!微软被盗测试账号拥有公司Office 365管理员权限

微软网络近期遭黑客入侵&#xff0c;高管电子邮件被监视长达两个月。 一位研究员表示&#xff0c;黑客通过获取一个拥有管理员权限的老旧测试帐号的访问权限来实施入侵&#xff0c;这是微软犯下的重大失误。 微软在1月25日&#xff08;上周四&#xff09;发布第二篇公告&…

Linux:重定向

Linux&#xff1a;重定向 输出重定向追加重定向输出重定向与追加重定向的本质输入重定向 输出重定向 在Linux中&#xff0c;输出重定向是一种将命令的输出发送到不同位置的方法。通常&#xff0c;执行命令时&#xff0c;输出会显示在终端上。然而&#xff0c;使用输出重定向&a…

vue3 + antd 封装动态表单组件(三)

传送带&#xff1a; vue3 antd 封装动态表单组件&#xff08;一&#xff09; vue3 antd 封装动态表单组件&#xff08;二&#xff09; 前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 我们发现ant-design-vue Input组件和FormItem组件某些属性支持slot插…

数据写入HBase(scala)

package sourceimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytesobject ffff {def main(args: Array[String]): Unit {//hbase连接配置val conf …

Tensorflow2.0笔记 - tensor的padding和tile

本笔记记录tensor的填充和tile操作&#xff0c;对应tf.pad和tf.tile import tensorflow as tf import numpy as nptf.__version__#pad做填充 # tf.pad( tensor,paddings, modeCONSTANT,nameNone) #1维tensor填充 tensor tf.random.uniform([5], maxval10, dtypetf.int32) pri…

猫咪不吃东西怎么办?排行榜上适口性好、性价比高的生骨肉冻干推荐

猫咪不吃东西怎么办&#xff1f;遇到这类情况需要主人去观察猫咪的情况&#xff0c;如果猫咪除了不吃猫粮还出现了呕吐、腹泻、体温异常等其他情况就要考虑猫咪是不是生病了。如果排除了疾病原因&#xff0c;猫咪不吃东西怎么办&#xff1f;可能是猫粮的口感不佳&#xff0c;使…

【重磅发布】已开放!模型师入驻、转格式再升级、3D展示框架全新玩法…

1月23日&#xff0c;老子云正式发布全新版本。此次新版本包含多板块功能上线和升级&#xff0c;为用户带来了含模型师入驻、三维格式在线转换升级、模型免费增值权益开放、全新3D展示框架等一系列精彩内容&#xff01; 1月23日&#xff0c;老子云正式发布全新版本。此次新版本…

Matlab plot绘图的 title 语法

x 0:1:10; >> y x.^2 -10*x15; >> plot(x,y) >> title(x_y, interpreter, none) title 里面的 x_y , y不会被当作下标。

STL初识——string的用法

string 一.string的介绍二.string的使用2.1接口&#xff08;构造类型&#xff09;2.2string的遍历和访问第一种遍历方式第二种遍历方式补充&#xff08;反向迭代器&#xff09;rbeign&#xff0c;rend 2.2接口&#xff08;常用函数&#xff09;2.2.1反转字符串&#xff08;reve…