当前位置: 首页 > 编程笔记 >

Mysql死锁以及查询包数据过大解决办法

归和惬
2023-05-05

前言

最近老顾经常碰到同事说,mysql又死锁了导致业务报错。今天我们就来聊聊死锁以及怎么解决的

锁类型

mysql锁级别:页级、表级、行级

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

产生原因:

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。

mysql数据库死锁

定义:线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

死锁的表现形式:我就说说我在项目中遇到的死锁情况吧,我们项目中存在着一个流程图,很多功能都是跟这个流程图有关,项目访问这些功能的时候就发现一直报错,但是访问其他的一切很正常,这种表现就很说明了项目是处于启动状态而且没有挂掉,去看后台服务也是一直没有报错,这种情况就是要检查一下数据库的问题了。

1.检查数据库是否挂掉

这个就很简单了,用数据库连接工具进行连接,连接上了,就说明数据库没有挂掉。

2.检查数据库是否存在死锁状况

select * from information_schema.innodb_trx;

13079544-43faa09a1801853c.png  

 

 

上面那张图说明是没有死锁情况的,当存在死锁是会查询到数据结果,有多少条死锁情况就会存在多少条数据。

3.解决方法

杀死进程id(就是上面命令的trx_mysql_thread_id列) kill 线程ID

mysql查询包数据过大

在项目中我们会遇到一种情况就是执行某一条sql语句的时候会报一个错误,就是一直提示“Packet for query is too large (1142 > 1024)”。出现这个问题的时候,你不要怀疑其他地方,十分明显的一个数据库问题,说的就是你写的sql语句的长度大小大于了你数据库查询包的最大值。

解决方法

查看目前配置 show VARIABLES like '%max_allowed_packet%'; 默认为1M

 

 

13079544-3ab57ca7497d4788.png  

 

这里我们就需要把他改为更大的值: set global max_allowed_packet = 210241024*10; 20M 这个方法执行之后就是当时就直接生效的,然后你执行上面的sql会发现还是你之前查询的那个值,这个时候其实是数据库缓存问题,还没有更新过来,等过几分钟在查询的话会发现值变成了你改成的那个值。

 类似资料:
  • 本文向大家介绍MySQL redo死锁问题排查及解决过程分析,包括了MySQL redo死锁问题排查及解决过程分析的使用技巧和注意事项,需要的朋友参考一下 问题背景 周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪,还好现场环境还在,为排查问题提

  • 本文向大家介绍简单说明Oracle数据库中对死锁的查询及解决方法,包括了简单说明Oracle数据库中对死锁的查询及解决方法的使用技巧和注意事项,需要的朋友参考一下 死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态, 此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。    死锁的定位

  • 本文向大家介绍MySQL死锁问题分析及解决方法实例详解,包括了MySQL死锁问题分析及解决方法实例详解的使用技巧和注意事项,需要的朋友参考一下 MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1、MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level lo

  • 问题内容: 我一直在尝试解决我在Golang并发中遇到的这个简单问题。我一直在搜索所有可能的解决方案,但没有发现与我的问题有关的特定信息(否则我可能会被遗漏)。这是我的代码: 它显示错误: 致命错误:所有goroutine都在睡觉-死锁! goroutine 1 [chan接收]:main.main()D:/Code/go/src/testconcurrency/main.go:23 + 0xca

  • 本文向大家介绍请你说一说死锁发生的条件以及如何解决死锁相关面试题,主要包含被问及请你说一说死锁发生的条件以及如何解决死锁时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象。死锁发生的四个必要条件如下: 互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该

  • 本文向大家介绍Oracle数据表中的死锁情况解决方法,包括了Oracle数据表中的死锁情况解决方法的使用技巧和注意事项,需要的朋友参考一下 在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定: 1.查找被锁定的表: 如果想知道具体是哪个进程阻塞了哪个进程,可用以下语句查看: 或 2.确定锁定表用户的si

  • 本文向大家介绍查询Sqlserver数据库死锁的一个存储过程分享,包括了查询Sqlserver数据库死锁的一个存储过程分享的使用技巧和注意事项,需要的朋友参考一下 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道哪个

  • 本文向大家介绍Oracle用户被锁的原因及解决办法,包括了Oracle用户被锁的原因及解决办法的使用技巧和注意事项,需要的朋友参考一下 在登陆时被告知test用户被锁 1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 2、查看具体的被锁时间 3、解锁 4、查看是那个ip造成的test用户被锁 查看$ORACLE_HOME/network/admin/log/listene