`

mysql之行锁

 
阅读更多

1.索引失效行锁变表锁



 

2.间隙锁

前段时间系统老是出现insert死锁,很是纠结。经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围。间隙锁的主要作用是为了防止出现幻读,但是它会把锁定范围扩大,有时候也会给我们带来麻烦,我们就遇到了。 在数据库参数中, 控制间隙锁的参数是:innodb_locks_unsafe_for_binlog, 这个参数默认值是OFF, 也就是启用间隙锁, 他是一个bool值, 当值为true时表示disable间隙锁。那为了防止间隙锁是不是直接将innodb_locaks_unsafe_for_binlog设置为true就可以了呢? 不一定!而且这个参数会影响到主从复制及灾难恢复, 这个方法还尚待商量。

间隙锁的出现主要集中在同一个事务中先delete 后 insert的情况下, 当我们通过一个参数去删除一条记录的时候, 如果参数在数据库中存在, 那么这个时候产生的是普通行锁, 锁住这个记录, 然后删除, 然后释放锁。如果这条记录不存在,问题就来了, 数据库会扫描索引,发现这个记录不存在, 这个时候的delete语句获取到的就是一个间隙锁,然后数据库会向左扫描扫到第一个比给定参数小的值, 向右扫描扫描到第一个比给定参数大的值, 然后以此为界,构建一个区间, 锁住整个区间内的数据, 一个特别容易出现死锁的间隙锁诞生了。

举个例子:
表task_queue
Id           taskId
1              2
3              9
10            20
40            41

开启一个会话: session 1

sql> set autocommit=0;

   ##

取消自动提交


sql> delete from task_queue where taskId = 20;
sql> insert into task_queue values(20, 20);

在开启一个会话: session 2

sql> set autocommit=0;

   ##

取消自动提交


sql> delete from task_queue where taskId = 25;
sql> insert into task_queue values(30, 25);

在没有并发,或是极少并发的情况下, 这样会可能会正常执行,在Mysql中, 事务最终都是穿行执行, 但是在高并发的情况下, 执行的顺序就极有可能发生改变, 变成下面这个样子:
sql> delete from task_queue where taskId = 20;
sql> delete from task_queue where taskId = 25;
sql> insert into task_queue values(20, 20);
sql> insert into task_queue values(30, 25);

这个时候最后一条语句:insert into task_queue values(30, 25); 执行时就会爆出死锁错误。因为删除taskId = 20这条记录的时候,20 --  41 都被锁住了, 他们都取得了这一个数据段的共享锁, 所以在获取这个数据段的排它锁时出现死锁。

这种问题的解决办法:前面说了, 通过修改innodb_locaks_unsafe_for_binlog参数来取消间隙锁从而达到避免这种情况的死锁的方式尚待商量, 那就只有修改代码逻辑, 存在才删除,尽量不去删除不存在的记录。

 

间隙锁摘录来源http://blog.csdn.net/andyxm/article/details/44810417

 

 

3.间隙锁再次举例,为的是让大家更清楚了解在什么场景下,会产生间隙锁

 

4.如何锁定一行

select * from table where id = 2 for update;

预定某一行后,其他的操作会被阻塞,直到锁定行的会话提交commit

 

5.查看行锁

show status like 'innodb_row_lock%'

 

行锁各状态说明

Innodb_row_lock_current_waits:当前正在等待锁定的数量;

Innodb_row_lock_time :等待总时长 重要

Innodb_row_lock_time_avg :每次等待所花平均时间; 重要

Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间;

Innodb_row_lock_waits :等待总次数   重要

 

 尤其是当等待次数很高,而且每次等待时长也不小的时候,我们就需要分享系统中为什么会有如此多的等待,然后根据分析结果着手指定优化计划

  • 大小: 29.7 KB
  • 大小: 24.7 KB
分享到:
评论

相关推荐

    mysql怎么减少行锁对性能的影响

    ### MySQL如何减少行锁对性能的影响 在MySQL数据库中,行锁是一种重要的锁定机制,它主要应用于InnoDB存储引擎中,用于控制并发事务对数据行的访问。行锁的使用可以显著提高系统的并发处理能力,但同时也会带来一定...

    MySQL 行锁和表锁的含义及区别详解

    MySQL中的行锁和表锁是两种不同的锁定机制,它们在并发控制和数据一致性方面起着关键作用。在MySQL中,不同的存储引擎支持不同的锁机制,其中InnoDB引擎是默认引擎,支持行锁和表锁,而MyISAM引擎只支持表锁。 1. *...

    mysql高级视频教程百度云(2019).txt

    62.MySQL高级_行锁总结.avi 61.MySQL高级_如何锁定一行.avi 60.MySQL高级_间隙锁危害.avi 59.MySQL高级_索引失效行锁变表锁.avi 58.MySQL高级_行锁演示答疑补充.avi 57.MySQL高级_行锁案例讲解.avi 56....

    2021年MySQL高级教程视频.rar

    20.MySQL高级锁InnoDB行锁行锁升级为表锁.avi 21.MySQL高级锁InnoDB行锁间隙锁危害.avi 22.MySQL高级锁InnoDB行锁争用情况查看.avi 23.MySQL高级锁InnoDB行锁总结.avi 24.MySQL高级SQL技巧SQL执行顺序及正则表达式....

    spring-transaction-manager:Spring事务管理实现原理及MySQL InnoBD引擎行锁概述---配套代码

    本篇将深入探讨Spring事务管理的实现原理以及MySQL InnoDB引擎的行锁概念。 Spring事务管理是通过其核心接口`PlatformTransactionManager`来实现的,它定义了事务开始、提交、回滚和查询事务状态的方法。Spring提供...

    尚硅谷Java视频教程_MySQL高级视频

    尚硅谷_MySQL高级_explain之select_type和table介绍 · 24.尚硅谷_MySQL高级_explain之type介绍 · 25.尚硅谷_MySQL高级_explain之possible_keys和key介绍 · 26.尚硅谷_MySQL高级_explain之key_len介绍 · 27....

    深入理解MySQL核心技术_MYSQL_

    《深入理解MySQL核心技术》这本书是MySQL数据库技术领域的一部经典之作,它旨在帮助读者深入了解MySQL的内部机制和工作原理,从而更好地优化和管理MySQL数据库系统。以下是对书中的主要知识点的详细阐述: 1. **...

    springmvc整合 mybatis +mysql 带测试例子保证能用

    接下来,我们将深入探讨如何将这两个框架整合,并结合MySQL数据库来构建一个实际的应用。 首先,SpringMVC是Spring框架的一个模块,主要负责Web应用程序的模型-视图-控制器(MVC)架构。它提供了强大的依赖注入特性...

    springmvc+mybatis+mysql框架整合保证能用带测试例子

    自己整合的分数不能再低了, 如果对你有用记得给个好评 十分感谢! 最好使用谷歌浏览器,当然其他浏览器也可以 建好数据库之后直接输入...springmvc+mybatis+mysql框架整合保证能用对本例子有什么问题直接回复我就行

    MySQL数据库原理及设计方法.pdf

    锁的粒度有表锁和行锁之分,行锁可以提供更高的并发性能,但会增加锁管理的复杂性。死锁检测和处理机制防止了事务间的恶性循环。 事务是确保数据库一致性的重要概念。一个事务包含一组DML语句,保证它们作为一个...

    mysql 锁表锁行语句分享(MySQL事务处理)

    MySQL中的锁机制是数据库事务处理中的重要组成部分,用于确保数据的一致性和完整性。在标题和描述中提到的“mysql 锁表锁行语句分享”是关于如何在MySQL中使用事务来锁定特定行数据,确保在操作期间不会被其他并发...

    MySQL数据库相关课件PPT

    MySQL数据库是全球最受欢迎的开源关系型数据库管理系统之一,它以其高效、可靠和易于维护的特点,在Web开发、企业级应用和数据分析等领域广泛应用。本课件PPT涵盖了MySQL的基础知识到高级特性的深入理解,旨在帮助...

    MySQL-5.1.18-src

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,由MySQL AB公司开发,后被Oracle公司收购。它的源代码开放,允许用户根据GPL(GNU General Public License)协议自由分发和修改。 MySQL 5.1系列是MySQL的一...

    PHP+redis+mysql innodb事务和行锁实现秒杀系统.zip

    PHP提供mysqli、PDO等数据库扩展,能够无缝连接MySQL,进行SQL查询、数据插入、更新、删除等操作,实现动态网站的数据持久化。此外,PHP还支持与其他数据库系统的连接,如PostgreSQL、SQLite、Oracle等,具有良好的...

    07.行锁功过:怎么减少行锁对性能的影响?1

    MySQL数据库中的行锁是提高并发处理能力的关键机制,特别是在InnoDB存储引擎中,行锁的存在使得多个事务能够并行处理同一表的不同行,从而提高了系统的吞吐量。然而,行锁的使用也可能带来性能问题,如锁冲突和死锁...

    mysql面试题50道和答案.docx

    8. MySQL 中 InnoDB 引擎的行锁是如何实现的?InnoDB 是基于索引来完成行锁的。例如,select * from tab_with_index where id = 1 for update; for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,...

    辛星笔记之MySQL优化篇

    在深入探讨辛星笔记之MySQL优化篇的内容之前,我们首先要了解MySQL优化的几个关键方面,这将帮助我们更好地理解文档中提供的知识点。 MySQL优化通常包括对数据库查询的优化、数据库结构的设计优化、服务器配置的...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

Global site tag (gtag.js) - Google Analytics