我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中的锁机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中的锁机制

抛砖引玉:多个查询需要在同一时刻进行数据的修改,就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。

锁的概念

读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源,而相互不干扰。

写锁的排他的。一个写锁会阻塞其他写锁或读锁。出于安全考虑只有这样才能保证在给定的时间里只有一个事务能够执行写入,并防止其他事务读取正写入的同一资源。

锁带来的问题

通过锁定机制可以实现事务的隔离性要求,使得事务可以并发的工作,同时也带来了三个问题:脏读,不可重复读和丢失更新。

脏读

脏数据:未提交的数据

如果读到了脏数据即一个事务可以读取到另一个事务中未提交的数据那就违背了事务的隔离性。

所以脏读是指在不同的事务下,当前事务可以读取到另外事务的未提交的数据,简单来说就是可以读取到脏数据。

演示:

初始状态:

image-20230813233401790

将会话A,B设置隔离级别为RU

set session transaction isolation level READ UNCOMMITTED;

image-20230813235156382

会话A插入一条数据

image-20230814000655870

这时候事务B在此执行查询操作,会发现事务B读取到了事务A新增的数据。注意:此时事务A没有提交。

image-20230814000932266

不可重复读

在一个事务中两次读取到的数据是不一样的,这中情况被称为不可重复读。

与脏读的区别:脏读是读取到了未提交的数据,而不可重复读是读取到的却是已经提交的数据,但是违反了数据库事务一致性的要求。

演示:

image-20230814002516720

事务B插入一条数据并且提交

image-20230814002726465

事务A在此执行select语句,事务A读取到了事务B提交的数据

image-20230814002910671

一般来说不可重复读问题是可以接受的,因为读取到的是已经提交的数据,本身不会带来什么问题。例如Oracle 和 SQL Server的默认的事务隔离级别就是RC。 MySQL默认的事务隔离级别是RR。

在MySQL InnoDB中通过使用 Next-key lock 算法来避免不可重复读问题,并且将不可重复读问题定义为幻读(Phantom problem)

丢失更新

一个数据的更新会被另一个事务的更新操作所覆盖,从而导致数据的不一致性。

第一种丢失:

A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来:

时间取款事务A转账事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5汇入100元把余额改为1100元
T6提交事务
T7取出100元把余额改为900元
T8撤销事务
T9余额恢复为1000 元(丢失更新)

第二类丢失更新

A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失:

时间转账事务A取款事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5取出100元把余额改为900元
T6提交事务
T7汇入100元
T8提交事务
T9把余额改为1100 元(丢失更新)

要避免丢失更新的发生,需要让事务在这种情况的操作变成串行化,而不是并行操作。即上面的select操作中加上排他锁。

MySQL锁的分类:

按照锁的粒度来说

MySQL主要包含三种类型(级别)的锁定机制:

全局锁:锁的是整个database。

表级锁:锁的是某个table。 (表排他锁,表共享锁,元数据锁,自增锁)

行级锁:锁的是某行数据,也可能锁定行之间的间隙。由某些存储引擎实现,比如InnoDB。

InnoDB的行级锁,按照锁定范围来说

分为四种:

记录锁(Record Locks):锁定索引中一条记录。

间隙锁(Gap Locks):要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索

引记录后面的值。

临键锁(Next-Key Locks):是索引记录上的记录锁和在索引记录之前的间隙锁的组合(间隙锁+记录

锁)。

插入意向锁(Insert Intention Locks):做insert操作时添加的对记录id的锁。

InnoDB的行级锁,按照功能来说

分为两种:

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过

索引条件检索的数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

注意:插入意向锁

(1)插入意向锁是一种Gap锁,不是意向锁,在insert操作时产生。

(2)在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等 待。

(3)假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之 间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。

(4)插入意向锁不会阻止任何锁,对于插入的记录会持有一个记录锁。

来源地址:https://blog.csdn.net/qq_43663493/article/details/132268122

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中的锁机制

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

下载Word文档

猜你喜欢

MySQL中的锁机制

抛砖引玉:多个查询需要在同一时刻进行数据的修改,就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源,而相互不干扰。 写锁的排
2023-08-23

【数据库】MySQL中的锁机制

MySQL中的锁机制 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。 MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各
2023-08-18

MySQL中的锁机制是什么

这篇“MySQL中的锁机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL中的锁机制是什么”文章吧。一.概述锁
2023-07-05

MySQL锁机制在INSERT中的锁管理策略

MySQL在INSERT操作时,会涉及到锁的管理策略,主要有以下几种:表锁(Table Lock):在某些情况下,MySQL会对整个表进行锁定,以防止其他事务对表的修改。当执行INSERT操作时,如果表级锁已经存在,其他事务将被阻塞,直到当
MySQL锁机制在INSERT中的锁管理策略
2024-08-14

MySQL锁机制在INSERT中的锁性能评估

MySQL的锁机制在INSERT操作中的性能受到多种因素的影响,主要包括并发性、表结构、索引、事务等。并发性:MySQL支持不同级别的锁,如表锁、行锁等。在INSERT操作中,如果表使用行级锁,则可以最大程度地减少锁冲突,提高并发性能。而如
MySQL锁机制在INSERT中的锁性能评估
2024-08-14

MySQL锁机制在INSERT中的锁等待分析

在MySQL中,当一个INSERT操作正在执行时,会涉及到锁机制来确保数据的一致性和并发性。在INSERT操作中可能会涉及到以下几种类型的锁:表锁(Table Lock):在插入数据时,MySQL会对整个表进行锁定,直到INSERT操作完成
MySQL锁机制在INSERT中的锁等待分析
2024-08-14

MySQL锁机制在INSERT中的锁粒度优化

在MySQL中,可以通过优化锁粒度来提高INSERT操作的性能和并发性。以下是一些优化锁粒度的方法:表锁:默认情况下,MySQL使用表级锁来控制对表的并发操作。这种锁粒度比较粗,会导致并发性能不佳。可以考虑将表锁优化为行级锁,使用InnoD
MySQL锁机制在INSERT中的锁粒度优化
2024-08-19

mysql的锁机制详解

这段时间一直在学习mysql数据库。项目组一直用的是oracle,所以对mysql的了解也不深。本文主要是对mysql锁的总结。Mysql的锁主要分为3大类:   表级锁:存储引擎为Myisam。锁住整个表,特点是开销小,加锁快,锁定力度大,发生锁冲突的概率最
2021-08-13

Mysql锁机制中行锁、表锁、死锁如何实现

这篇文章主要介绍了Mysql锁机制中行锁、表锁、死锁如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Mysql锁是什么?锁有哪些类别?锁定义: 同一时间同一资
2023-06-29

MySQL的锁机制在并发控制中的应用

MySQL的锁机制在并发控制中起到了至关重要的作用。它通过锁定资源来避免多个事务同时访问和修改数据,从而确保数据的一致性和完整性。以下是MySQL锁机制在并发控制中的几个关键应用:避免数据冲突:在并发环境中,如果没有适当的锁机制,多个事务可
MySQL的锁机制在并发控制中的应用
2024-10-21

ORM框架中的MySQL锁机制理解

ORM(Object-Relational Mapping,对象关系映射)框架是一种在面向对象编程语言中实现数据库操作的方法。它允许开发者使用面向对象的方式操作数据库,而不是直接编写SQL语句。ORM框架通常会为每个数据库表提供一个对应的类
ORM框架中的MySQL锁机制理解
2024-10-05

MySQL的锁机制——记录锁、间隙锁、临键锁

记录锁(Record Locks) 记录锁锁住的是索引记录,记录锁也叫行锁。如果使用索引作为条件命中了记录,那么就是记录锁,被锁住的记录不能被别的事务插入相同的索引键值,修改和删除。 例如: select * from test_table
2023-08-18

编程热搜

目录