首页 > 数据库 >mysql锁及锁出现总结

mysql锁及锁出现总结

时间:2023-04-18 13:32:08浏览次数:39  
标签:总结 事务 行锁 mysql 锁及 并发 MySQL 锁定 数据

转载请注明出处:

1.按锁粒度分类:

  1. 行锁:锁某行数据,锁粒度最小,并发度高;; 行锁是指加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问; 行锁是对所有行级别锁的一个统称,比如下面说的记录锁、间隙锁、临键锁都是属于行锁
  2. 表锁:锁整张表,锁粒度最大,并发度低; 上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问;
  3. 间隙锁:锁的是一个区间

什么情况会出现表锁

MySQL中的表锁主要是为了解决一些特殊情况下的并发问题而引入的,比如:

  1. ALTER TABLE操作:在执行ALTER TABLE操作时,MySQL会获取一个排它锁,防止其他事务对该表进行读写操作;
  2. 大事务操作:如果一个事务中包含大量的数据操作,比如更新或删除大量数据,那么MySQL会自动将该事务的隔离级别提升为SERIALIZABLE,也就是串行化,此时会对涉及到的所有表进行锁定,避免其他事务对该表的并发操作;
  3. 锁冲突较多:如果系统中存在较多的锁冲突,比如同一个表上有多个事务争夺同一个行锁或排它锁时,MySQL会自动将该表的锁级别提升为表锁,避免锁冲突的出现,提高系统的性能。 需要注意的是,表锁是对整张表进行锁定,因此会对其他事务的并发操作产生较大的影响,会导致系统的响应时间变慢,降低系统的并发性能。因此,在实际应用中,应该尽量避免使用表锁,而是采用行锁或其他更细粒度的锁机制来保证数据的一致性和并发性。

什么情况会出现行锁

  MySQL中的行锁主要是为了保证并发读写的一致性而引入的,当多个事务同时对同一行进行读写操作时,MySQL就会自动对该行进行行级别的锁定,以保证数据的一致性。具体来说,会出现以下情况:

  1. UPDATE和DELETE操作:当使用UPDATE或DELETE语句更新或删除表中的某行数据时,MySQL会自动对该行进行排它锁定,避免其他事务同时对该行进行操作;
  2. INSERT操作:当使用INSERT语句插入新数据时,MySQL会自动对新插入的行进行共享锁定,避免其他事务对该行进行写操作;
  3. 查询操作:当使用SELECT ... FOR UPDATE语句进行查询时,MySQL会对查询结果所涉及到的所有行进行排它锁定,避免其他事务同时对该行进行操作;
  4. 锁冲突:当多个事务同时对同一行进行操作时,会产生锁冲突,此时MySQL会自动对该行进行行级别的锁定,以保证数据的一致性。 需要注意的是,行锁是对单行数据进行锁定,因此对系统的并发性能影响较小,但是在高并发和大数据量的情况下,可能会出现死锁和锁等待等问题,因此在实际应用中需要注意锁的细粒度和锁的使用场景,以避免出现性能问题。

什么时候会出现间隙锁

  MySQL中的间隙锁是一种特殊的行锁,用于保证索引的一致性和避免幻读现象的出现。当执行范围查询操作时,MySQL会对查询范围内的所有行进行锁定,同时还会对查询范围之间的空隙或未被查询到的行进行间隙锁定,以保证数据的一致性。具体来说,会出现以下情况:

  1. 事务A向表中插入一行数据,此时MySQL会对该行进行行锁定;
  2. 事务B在相同的索引值处插入一行数据,此时MySQL会对该行进行行锁定,并对索引值范围之间的空隙进行间隙锁定,避免事务C在该范围内插入数据;
  3. 事务C在索引值范围内插入一行数据,此时MySQL会被阻塞,直到事务A或事务B提交或回滚,释放行锁和间隙锁,以避免幻读现象的出现。 需要注意的是,间隙锁会对系统的并发性能产生一定的影响,因此在实际应用中需要注意锁的细粒度和锁的使用场景,以避免出现性能问题。同时,在使用间隙锁时,需要注意锁的范围和锁的模式,以保证数据的一致性和并发性能。

2.按锁的作用范围分类

2.1 按锁的作用范围可以分为:

  • 乐观锁:并不会真正的去锁某行记录,而是通过一个版本号来实现的
  • 悲观锁:行锁、表锁等都是悲观锁

2.2 悲观锁

悲观锁,正如其名,具有强烈的独占和排他特性,每次去拿数据的时候都认为别人会修改,对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。

适用于并发量不大、写入操作比较频繁、数据一致性比较高的场景。但是由于需要频繁的加锁和解锁,可能会导致性能瓶颈。

在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。

悲观锁的实现主要有两种方式:一种是使用SELECT ... FOR UPDATE语句,在读取数据时获得行级锁;另一种是使用SELECT ... LOCK IN SHARE MODE语句,在读取数据时获得共享锁。

  (4) 实战

商品goods表中id,name,number分别代表商品ID,商品名称,商品库存。

2.3 乐观锁

乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

适用于读多写少,因为如果出现大量的写操作,写冲突的可能性就会增大,业务层需要不断重试,会大大降低系统性能。

  (3) 实现方式

乐观锁的实现主要有两种方式:一种是使用版本号,每个数据记录都有一个版本号,更新时需要比较版本号是否一致;另一种是使用CAS(Compare and Swap)操作,即比较并替换。

版本比较的流程:一般使用数据版本(Version)记录机制实现,在数据库表中增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。

3.按锁的类型分类

3.1 按锁的类型分类

  • 共享锁(读锁):多个线程可以同时获取同一份数据的共享锁,读取数据但不能修改数据;
  • 排他锁(写锁):只允许一个线程获取排他锁,可以读取并修改数据。

3.2 共享锁

  共享锁(Shared Lock):共享锁是一种读锁,多个事务可以同时持有相同的共享锁,但是不能与排他锁同时存在。共享锁的主要作用是防止其他事务对数据进行修改,以保证事务的隔离性。在执行SELECT语句时,MySQL会自动加上共享锁,以避免其他事务对数据进行修改,但是不会阻塞其他事务的读取操作。

LOCK IN SHARE MODE或SELECT ... FOR SHARE语句加上共享锁。

3.3 排它锁

在执行INSERT、UPDATE和DELETE等操作时,MySQL会自动加上排他锁,以避免其他事务对数据进行读取和修改。

使用SELECT ... FOR UPDATE或UPDATE ... WHERE语句加上排他锁

 

 

 



标签:总结,事务,行锁,mysql,锁及,并发,MySQL,锁定,数据
From: https://blog.51cto.com/u_15535797/6203192

相关文章

  • 4月17号总结
    1、典型用户分析当写一个软件的时候,都知道要为用户考虑,但是用户在哪里?有同学写“二手交易软件”–说来铁道大学的学生都是我的用户,但是他们有没有区别呢?有同学写“自动柜员机系统”,那到底有多少类型的用户来到柜员机前呢?这些都是团队成员在需求分析和设计阶段要反复琢磨的问题......
  • ORACLE修改ORACLE_SID总结
    在某些特殊情况下,需要修改当前Oracle数据库实例中的ORACLE_SID。下面简单的总结一下如何修改$ORACLE_SID的步骤。默认情况下,INSTANCE_NAME参数和ORACLE_SID的值是相同的,但是它们也可以不同。另外,如果参数文件(pfile或spfile)中没有指定instance_name的值,那么它的值跟ORACLE_SID的值......
  • 测试环境治理之MYSQL索引优化篇
    作者:京东物流 李光新1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试环境的......
  • MySQL导入导出 —— mysqldump 简介及常见用法
    一、导出导出用户需要有导出对象的权限,例如导出表要有select权限、导出视图要有showview权限、导出触发器要有trigger权限、需要锁表时要有locktables权限等。如果dump文件中包含了GTID信息,则无法导入到未启用GTID的数据库(低于5.6.9版本的数据库不支持GTID,因此也无法导入到这些......
  • oracle、达梦数据库、MySQL数据创建表与字段注释
    /**1.oracle注释*//*表本身注释*/commentontable表名is'注释信息';/*字段注释*/commentoncolumn表名.字段名is'注释信息';/*实例如下:*/commentontableUSERis'用户表';commentoncolumnUSER.IDis'主键ID';/**2.MySQL注释*//*表本身注释*/altertable表名co......
  • makefile使用总结--规则
    本文参考《跟我一起写Makefile》编写,并做了一些适合个人习惯的修改,稍加总结而成。 一篇文章肯定不够详细记录makefile所有的知识,所以这篇接着描述Makefile的规则。规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在Makefile中,规则的顺序是很重要的,因为,Makefile中只应......
  • 测试环境治理之MYSQL索引优化篇
    作者:京东物流 李光新1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试......
  • 应用连MySQL 报错ERROR 1129 Host is blocked because of many connection errors
    开发反馈应用连MySQL报错 createconnectionSQLException,url:连接串,errorCode1129。搜索1129报错,报错内容为:Hostisblockedbecauseofmanyconnectionerrors一、报错原因同一个ip在短时间内产生太多中断的数据库连接(超过mysql数据库max_connection_errors设置),导......
  • Windows系统下,HHDBCS辅助Mysql安装
    通常来说,安装好Mysql后,使用HHDBCS和本机IP,就可以直接连入数据库。但有时候在安装成功的情况下,却连接不上Mysql。此时可以点击测试,会弹出提示框:由提示可知,被Mysql拒绝访问了。我们可以通过CMD来解决这个问题。使用管理员模式进入CMD;在登入mysql后,更改“mysql”数据库里的“......
  • ReactiveUI使用笔记,教程总结
    ReactiveUI使用笔记,教程总结一、LINQ和RxLINQ(LanguageIntergratedQuery)对数据集合、关系数据、XML文件等对象进行查询和提取数据的技术,提供了统一的类似SQL的语法来对数据进行查询,而不用关心数据源的不同。二、Rx(ReactiveExtensions)对LING的一种扩展,提供了一种新的组织和......