iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL表锁、行锁、排它锁及共享锁怎么使用
  • 336
分享到

MySQL表锁、行锁、排它锁及共享锁怎么使用

2023-06-29 19:06:59 336人浏览 独家记忆
摘要

这篇文章主要介绍“MySQL表锁、行锁、排它锁及共享锁怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mysql表锁、行锁、排它锁及共享锁怎么使用”文章能帮助大家解决问题。一、事务隔离机制的选

这篇文章主要介绍“MySQL、行锁、排它锁及共享锁怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mysql表锁、行锁、排它锁及共享锁怎么使用”文章能帮助大家解决问题。

    一、事务隔离机制的选择

    • 如果我们完全不管,使用未提交读的事务隔离机制,任由这些线程并发操作数据库,那就会出现脏读(读取了未commit的数据)、不可重复读(两次查询值不同)、幻读(两次查询数据量不同)等问题,数据的安全性最低,优点是并发效率非常高,一般不会使用

    • 如果我们串行化(靠锁实现),通过锁给所有的事务都排个序,虽然数据的安全性提高了,并发的效率就太低了,一般也不会使用

    • 所以我们一般用的是已提交读、可重复读这两个隔离级别,平衡了数据的安全性,一致性以及并发的效率 ,是由mvcC多版本并发控制实现的(MVCC是已提交读和可重复读的原理,锁是串行化的原理)

    二、表级锁&行级锁

    表级锁:对整张表加锁。开销小(因为不用去找表的某一行的记录进行加锁,要修改这张表,直接申请加这张表的锁),加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低

    行级锁:对某行记录加锁。开销大(需要找到表中相应的记录,有搜表搜索引的过程),加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    InnoDB存储引擎支持事务处理,表支持行级锁定,并发能力更好

    1. InnoDB行锁是通过给索引上的索引项加锁来实现的,而不是给表的行记录加锁实现的,这就意味者只有通过索引条件检索数据,InnoDB才使用行级锁,否则InnoDB将使用表锁

    2. 由于InnoDB的行锁实现是针对索引字段添加的锁,不是针对行记录加的锁,因此虽然访问的是InnoDB引擎下表的不同行,但如果使用相同的索引字段作为过滤条件,依然会发生锁冲突,只能串行进行,不能并发进行

    3. 即使sql中使用了索引,但是经过mysql优化器后,如果认为全表扫描比使用索引效率高,此时会放弃使用索引,因此也不会
      使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引

    三、排它锁(Exclusive)和共享锁(Shared)

    • 排它锁,又称为X锁,写锁

    • 共享锁,又称为S锁,读锁

    读读(SS)之间是可以兼容的,但是读写(SX、SX)之间,写写(XX)之间是互斥的

    对事务加X和S锁之间有以下的关系:

    • 一个事务对数据对象A加了 S 锁,可以对A进行读取操作但不能进行update操作,加锁期间其它事务能对A加S锁但不能加 X 锁

    • 一个事务对数据对象A加了 X 锁,就可以对A进行读取和更新,加锁期间其它事务不能对A加任何锁

    显示加锁:select … lock in share mode强制获取共享锁,select … for update获取排它锁

    1. 测试不同事务之间排它锁和共享锁的兼容性

    我们先查看表的SQL以及内容

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    查看隔离级别:

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    首先开启一个事务,给id=7的数据加上排它锁

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    在用另一个客户端开启事务

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    我们用另一个事务的服务线程给id=7的数据加上排它锁,阻塞了

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    我们尝试给id=7的数据加上共享锁,还是阻塞了

    总结:不同事务之间对于数据的锁,只有SS锁可以共存,XX、SX、XS都不能共存

    2. 测试行锁加在索引项上

    其实行锁是加在索引树上的

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    用表的无索引字段作为过滤条件

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    事务2现在同样想获取这条记录的排它锁,可想而知地失败了;那现在事务2获取chenwei的记录的排它锁,试试能不能成功

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    InnoDB是支持行锁的,刚才以主键id为过滤条件时,事务1和事务2获取不同行的锁是可以成功的。然而现在我们发现获取name为chenwei的排它锁也获取不到了,这是为什么?我们解释一下:

    InnoDB的行锁是通过给索引项加锁来实现的,而不是给表的行记录加锁实现的

    而我们用name作为过滤条件没有用到索引,自然就不会使用行锁,而是使用表锁。这就意味着只有通过索引检索数据,InnoDB才使用行级锁,否则InnoDB都将使用表锁!!!

    我们给name字段加上索引

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    我们发现,给name加上索引后,两个事务可以获取到不同行的排它锁(for update),再一次证明了InnoDB的行锁是加在索引项上的

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    因为现在name走的是索引, 通过zhangsan在辅助索引树上找到它所在行记录的id是7,然后到主键索引树上,获取对应行记录的排他锁(个人猜测应该是辅助索引树和主键索引树相应的记录都加了锁)

    四、串行化隔离级别测试

    (所有的事务都使用排它锁或共享锁,不需要用户手动加锁)

    设置串行化隔离级别

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    两个事务可以同时获取共享锁(SS共存)

    MySQL表锁、行锁、排它锁及共享锁怎么使用


    现在让事务2插入数据

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    此时由于insert需要加排它锁,但由于事务1已经对整张表添加了共享锁,事务2无法再对表成功加锁(SX不共存)

    rollback一下

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    因为我们给name加上了索引,以上的select相当于给name为zhangsan的数据加上了行共享锁

    事务2 update

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    事务2不能update,因为此时已经被事务1的共享锁锁住了整个表

    事务2在辅助索引树上找zhangsan,找到对应的主键值,然后去主键索引树找到相应的记录,但是发现这行记录已经被共享锁锁住了,事务2可以获取共享锁,但是不能获取排他锁

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    我们用主键索引id试试能不能update

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    依然阻塞住了,虽然我们where后面的字段现在使用的id而不是name,但是name也是通过辅助索引树找到对应的主键,再到主键索引树上找相应的记录,而主键索引树上的记录加了锁(个人猜想应该是辅助索引树和主键索引树对应的数据都加了锁)

    我们update id=8的数据,成功了。因为我们select的时候,只是给id=7的数据加上了行锁,我们操作id=8的数据当然可以成功

    MySQL表锁、行锁、排它锁及共享锁怎么使用

    有索引,则使用行锁;没有索引,则使用表锁。

    表级锁还是行级锁说的是锁的粒度,共享锁和排他锁说的是锁的性质,不管是表锁还是行锁,都有共享锁和排他锁的区分

    关于“MySQL表锁、行锁、排它锁及共享锁怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网数据库频道,小编每天都会为大家更新不同的知识点。

    您可能感兴趣的文档:

    --结束END--

    本文标题: MySQL表锁、行锁、排它锁及共享锁怎么使用

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

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

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

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

    下载Word文档
    猜你喜欢
    • MySQL表锁、行锁、排它锁及共享锁怎么使用
      这篇文章主要介绍“MySQL表锁、行锁、排它锁及共享锁怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL表锁、行锁、排它锁及共享锁怎么使用”文章能帮助大家解决问题。一、事务隔离机制的选...
      99+
      2023-06-29
    • MySQL表锁、行锁、排它锁及共享锁的使用详解
      目录前言一、事务隔离机制的选择二、表级锁&行级锁三、排它锁(Exclusive)和共享锁(Shared)1. 测试不同事务之间排它锁和共享锁的兼容性2. 测试行锁加在索引项上...
      99+
      2024-04-02
    • MySQL的表级锁,行级锁,排它锁和共享锁是什么
      这篇文章主要介绍“MySQL的表级锁,行级锁,排它锁和共享锁是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的表级锁,行级锁,排它锁和共享锁是什么”文章能帮助大家解决问题。前言先说下事...
      99+
      2023-07-02
    • MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析
      小编给大家分享一下MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!锁,在现...
      99+
      2024-04-02
    • MySQL的意向共享锁、意向排它锁和死锁是什么
      本篇内容介绍了“MySQL的意向共享锁、意向排它锁和死锁是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、InnoDB的表级锁在绝大多...
      99+
      2023-07-02
    • mysql中的排它锁x和共享锁s的介绍
      这篇文章主要介绍“mysql中的排它锁x和共享锁s的介绍”,在日常操作中,相信很多人在mysql中的排它锁x和共享锁s的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”my...
      99+
      2024-04-02
    • mysql行锁和表锁怎么使用
      MySQL中的行锁和表锁是用来控制并发访问数据库的机制,可以防止多个用户同时修改同一行或同一表的数据,保证数据的一致性和完整性。1....
      99+
      2023-09-11
      mysql
    • 一文学习MySQL 意向共享锁、意向排他锁、死锁
      目录一、InnoDB表级锁二、意向共享锁和意向排他锁三、死锁1. 数据库中的死锁2. 死锁场景以及解决办法3. 操作四、锁的优化建议一、InnoDB表级锁 我们知道,InnoDB是支...
      99+
      2024-04-02
    • mysql共享锁与排他锁用法实例分析
      本文实例讲述了mysql共享锁与排他锁用法。分享给大家供大家参考,具体如下: mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁...
      99+
      2024-04-02
    • 解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器
      前言并发事务问题锁分类锁定读共享锁排它锁 意向排它、意向共享锁自增锁记录锁间隙锁InnoDB 行锁模式及加锁方法死锁总结 前言 MySQL 锁机制比较显而易见,其最显著的特点是不...
      99+
      2023-10-18
      mysql java 数据库
    • MySQL与InnoDB下共享锁与排他锁实例分析
      这篇文章主要介绍“MySQL与InnoDB下共享锁与排他锁实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL与InnoDB下共享锁与排他锁实例分析”文...
      99+
      2024-04-02
    • 【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?
      文章目录 前言哪些场景会造成行锁升表锁?如何避免如何分析排查查看`InnoDB_row_lock%`相关变量查看 `INFORMATION_SCHEMA`系统库 总结最后 前言 在上文我们曾小小的提到过,在索引失效的情况下...
      99+
      2023-08-18
      数据库 大数据 mysql 行锁升表锁 java
    • mysql中什么是排它锁
      本篇文章为大家展示了mysql中什么是排它锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明排他锁 exclusive lock(也叫writer lock)又称写锁,是悲观锁的一种实现。排它...
      99+
      2023-06-15
    • 使用mybatisplus操作mysql给select加数据行的排它锁并释放锁
      在使用 MyBatis-Plus 查询时,也可以通过在 SQL 语句中添加 FOR UPDATE 子句来实现加上数据行的排它锁。同样地,要释放锁需要执行 commit 或 rollback 操作,这样...
      99+
      2023-09-30
      mysql mybatis 数据库
    • mysql表锁和行锁区别是什么
      小编给大家分享一下mysql表锁和行锁区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、表锁特点:偏向MyISAM存储...
      99+
      2024-04-02
    • MySQL使用表锁和行锁的场景详解
      目录前言全局锁表级锁表锁元数据锁意向锁行级锁总结前言 MySQL Innodb 的锁可以说是执行引擎的并发基础了,有了锁才能保证数据的一致性。众所周知,我们都知道 Innodb 有全...
      99+
      2024-04-02
    • mysql共享锁指的是什么
      小编给大家分享一下mysql共享锁指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、说明共享锁,也称读锁,多用于判断数据是否存在,多个读操作可以同时进行...
      99+
      2023-06-15
    • Mysql加锁流程详解&MySQL 啥时候用表锁,啥时候用行锁?
      文章目录 Mysql加锁流程详解前言一、锁的内存结构二、加锁流程1、加锁的基本流程2、根据主键加锁3、根据二级索引加锁4、根据非索引字段查询加锁 5、加锁规律三、影响锁的因素四、锁信息查...
      99+
      2023-09-16
      数据库 MySQL 加锁流程 行锁 表锁
    • MySql的行级锁和表级锁是怎样的
      MySql的行级锁和表级锁是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 MySql 行级锁 表级锁如何保...
      99+
      2024-04-02
    • mysql死锁怎么排查及解决
      MySQL死锁是指两个或多个事务互相持有对方需要的资源,同时又等待对方释放资源,导致系统无法继续进行下去的情况。解决MySQL死锁问...
      99+
      2023-09-21
      mysql
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作