iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的意向共享锁、意向排它锁和死锁
  • 936
分享到

MySQL的意向共享锁、意向排它锁和死锁

MySQL意向共享锁MySQL意向排它锁MySQL死锁 2022-07-14 13:07:09 936人浏览 独家记忆
摘要

目录一、InnoDB的表级锁二、意向共享锁和意向排它锁三、死锁1. 数据库中的死锁2. 死锁场景以及解决方法3. 操作三、锁的优化建议一、InnoDB的表级锁 在绝大多数情况下应该使用行锁,因为事务和行锁往往是选择Inn

一、InnoDB的表级锁

在绝大多数情况下应该使用行锁,因为事务和行锁往往是选择InnoDB的理由,但个别情况下也使用表级锁。

事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间等待和锁冲突事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚

我们希望获取表锁时,执行以下命令:

MySQL的意向共享锁、意向排它锁和死锁

在使用表锁的时候,涉及的效率问题:
要获取一张表的共享锁S或者排它锁X,首先要确定这张表没有被其它事务获取过X锁,这张表里面的数据没有被其它事务获取过行锁X锁。

假如我们这张表有一千万个数据,怎么判断这一千万个数据哪些行有X锁?
如果想获得表的S锁,就需要判断表里面哪些行有过X锁,如果有一些行有过X锁,那么就不能获取这张表的S锁或者X锁。除了挨个检查,没有更好的办法,这就导致效率低下的问题

由于需要加表锁而去挨个遍历数据,确定是否有某些数据被加了行锁,而导致的效率低下问题。我们这里学习的意向共享锁和意向排他锁就可以解决,当要获取表的X锁是,不需要再检查表中的哪些行锁被(X或者S)占用,只需要快速检查IX和IS锁即可

二、意向共享锁和意向排它锁

  • 意向共享锁(IS锁):事务计划给记录加行共享锁,事务在给一行记录加共享锁前,必须先取得该表的IS锁
  • 意向排他锁(IX锁):事务计划给记录加行排他锁,事务在给一行记录加排他锁前,必须先取得该表的IX锁

MySQL的意向共享锁、意向排它锁和死锁

  • 在加行锁之前,由InnoDB存储引擎加上表的IS或IX锁
  • 意向锁之间都是兼容的,不会产生冲突,主要是为了辅助其他的在获取表锁的时候加快效率
  • 意向锁存在的意义是为了更高效的获取表锁(表格中的X和S指的是表锁,不是行锁!)
  • 意向锁是表级锁协调表锁和行锁的共存关系。主要目的是显示事务正在锁定某行或者试图锁定某行。

分析事务1获取行X锁和事务2获取表S锁:

首先事务1需要给表的第10行数据加X锁,于是InnoDB存储引擎自动给整张表加上了IX锁。当事务2再想获取整张表的S锁时,看到这张表已经有别的事务获取了IX锁了,就说明这张表肯定有某些数据被加上了X锁,这就导致事务2不能给整张表加S锁了。此时事务2只能等待,无法成功获取表S锁

三、死锁

1. 数据库中的死锁

MyISAM表锁时deadlock free的,这是因为MyISAM 不支持事务,只支持表锁,总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个sql组成的事务外,锁是逐步获得的,即锁的粒度比较小,这就决定了在InnoDB中发生死锁是可能的。当然如果处理多张表,还是有可能出现死锁的。

死锁问题一般都是我们自己造成的,和多线程编程的死锁情况相似,大部分都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题。因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按相同的顺序进行更新操作,以防止锁冲突导致死锁问题。

2. 死锁场景以及解决方法

死锁出现的场景如下:

事务1成功获取行锁1
事务2成功获取行锁2

事务1无法获取行锁2,被阻塞的同时没有办法执行commit/rollback,无法释放行锁1
事务2无法获取行锁1,被阻塞的同时没有办法执行commit/rollback,无法释放行锁2

MySQL的意向共享锁、意向排它锁和死锁

所有的事务都阻塞了,相当于进程内的所有线程都阻塞了,造成了死锁问题。

解决死锁的方法:多个事务/线程获取多个相同资源锁的时候,应该按照同样的顺序,获取资源的锁。

事务被阻塞或者死锁了,Mysqld(MySQL Server守护进程)设置有事务阻塞的超时时间,事务不会阻塞很长时间,超时后事务处理失败,自动释放当前占有的锁。

3. 操作

设置手动提交和可重复读隔离级别并开启事务

MySQL的意向共享锁、意向排它锁和死锁

查询一下表数据,在可重复读隔离级别使用的是mvcC提供的快照读,并没有加锁

MySQL的意向共享锁、意向排它锁和死锁

事务1获取id=7的排他锁,事务2获取id=8的排他锁

MySQL的意向共享锁、意向排它锁和死锁

事务1再获取id=8的排它锁,发生阻塞

MySQL的意向共享锁、意向排它锁和死锁

事务2再获取id=7的排它锁,发生阻塞

MySQL的意向共享锁、意向排它锁和死锁

此时由于mysql Server检测到发生了死锁,于是解除事务1的阻塞,进行事务1的rollback,释放其占有的行锁,于是事务2成功获取id=7的排它锁

三、锁的优化建议

  • 在能正确完成业务的前提下,为确保效率,尽量使用较低的隔离级别(必须避免脏读)
  • 设计合理的索引尽量使用索引访问数据,使加锁更准确,减少锁冲突的机会,提高并发能力
  • 选择合理的事务大小,小事务发生锁冲突的概率小(事务越大,包含的SQL越多,可能包含更多的表资源和行资源的锁,增大了锁冲突的概率)不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会
  • 尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响(其实等值查询也会加间隙锁)不要申请超过实际需要的锁级别
  • 除非必须,查询时不要显示加锁(在已提交读和可重复读隔离级别,MVCC提供了读取机制,不需要手动加锁)

到此这篇关于MySQL的意向共享锁、意向排它锁和死锁的文章就介绍到这了,更多相关MySQL锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的意向共享锁、意向排它锁和死锁

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL的意向共享锁、意向排它锁和死锁是什么
    本篇内容介绍了“MySQL的意向共享锁、意向排它锁和死锁是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、InnoDB的表级锁在绝大多...
    99+
    2023-07-02
  • 一文学习MySQL 意向共享锁、意向排他锁、死锁
    目录一、InnoDB表级锁二、意向共享锁和意向排他锁三、死锁1. 数据库中的死锁2. 死锁场景以及解决办法3. 操作四、锁的优化建议一、InnoDB表级锁 我们知道,InnoDB是支...
    99+
    2024-04-02
  • MySQL:意向锁
    文章目录 重要提示一、加锁级别二、意向锁是什么2.1、意向排它锁2.2、意向共享锁 二、意向锁有什么用2.1、背景2.2、解决方案 三、意向锁和行级锁的场景 重要提示 意向锁之间...
    99+
    2023-09-07
    mysql 数据库
  • MySQL的表级锁,行级锁,排它锁和共享锁是什么
    这篇文章主要介绍“MySQL的表级锁,行级锁,排它锁和共享锁是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的表级锁,行级锁,排它锁和共享锁是什么”文章能帮助大家解决问题。前言先说下事...
    99+
    2023-07-02
  • 解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器
    前言并发事务问题锁分类锁定读共享锁排它锁 意向排它、意向共享锁自增锁记录锁间隙锁InnoDB 行锁模式及加锁方法死锁总结 前言 MySQL 锁机制比较显而易见,其最显著的特点是不...
    99+
    2023-10-18
    mysql java 数据库
  • MySQL表锁、行锁、排它锁及共享锁怎么使用
    这篇文章主要介绍“MySQL表锁、行锁、排它锁及共享锁怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL表锁、行锁、排它锁及共享锁怎么使用”文章能帮助大家解决问题。一、事务隔离机制的选...
    99+
    2023-06-29
  • mysql中的排它锁x和共享锁s的介绍
    这篇文章主要介绍“mysql中的排它锁x和共享锁s的介绍”,在日常操作中,相信很多人在mysql中的排它锁x和共享锁s的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”my...
    99+
    2024-04-02
  • MySQL表锁、行锁、排它锁及共享锁的使用详解
    目录前言一、事务隔离机制的选择二、表级锁&行级锁三、排它锁(Exclusive)和共享锁(Shared)1. 测试不同事务之间排它锁和共享锁的兼容性2. 测试行锁加在索引项上...
    99+
    2024-04-02
  • MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析
    小编给大家分享一下MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!锁,在现...
    99+
    2024-04-02
  • Oracle和MySQL中有意向锁吗
    这篇文章主要介绍“Oracle和MySQL中有意向锁吗”,在日常操作中,相信很多人在Oracle和MySQL中有意向锁吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Orac...
    99+
    2024-04-02
  • mysql意向锁的类型有哪些
    这篇文章主要介绍“mysql意向锁的类型有哪些”,在日常操作中,相信很多人在mysql意向锁的类型有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql意向锁的类型有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
  • MySQL中的插入意向锁是什么
    今天小编给大家分享一下MySQL中的插入意向锁是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-01-06
    mysql
  • InnoDB怎么使用意向锁
    这篇文章主要为大家展示了“InnoDB怎么使用意向锁”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“InnoDB怎么使用意向锁”这篇文章吧。一,共享/排它锁(Sh...
    99+
    2024-04-02
  • mysql共享锁与排他锁用法实例分析
    本文实例讲述了mysql共享锁与排他锁用法。分享给大家供大家参考,具体如下: mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁...
    99+
    2024-04-02
  • MySQL与InnoDB下共享锁与排他锁实例分析
    这篇文章主要介绍“MySQL与InnoDB下共享锁与排他锁实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL与InnoDB下共享锁与排他锁实例分析”文...
    99+
    2024-04-02
  • MySQL死锁的案例分享
    本篇内容介绍了“MySQL死锁的案例分享”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个死锁的小例子: ...
    99+
    2024-04-02
  • MySQL中的插入意向锁使用案例分析
    这篇文章主要讲解了“MySQL中的插入意向锁使用案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中的插入意向锁使用案例分析”吧! ...
    99+
    2023-02-07
    mysql
  • Java并发中死锁、活锁和饥饿是什么意思
    解答 死锁是指两个或者两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去。 如果线程的智力不够, 且都秉承着“谦让”的原则,...
    99+
    2024-04-02
  • mysql中更新锁与排它锁的示例分析
    这篇文章将为大家详细讲解有关mysql中更新锁与排它锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一直没有认真了解UPDATE操作的锁,最近在MSDN...
    99+
    2024-04-02
  • MySQL 死锁异常排查和处理
    场景 删除车辆信息同时异步通知查询服务更新 查询服务采用 insert into view 方式增加数据(导致行级锁) 查询服务和删除车辆 争夺车辆表的锁,造成死锁 服务报错日志 2022-...
    99+
    2023-09-28
    mysql java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作