java学习笔记程序员技术栈

mysql死锁以及查询包数据过大解决方法

2019-02-02  本文已影响4人  菜菜___

今天在这里给大家分享自己在项目中遇到的两个数据库问题以及解决方法。

mysql数据库死锁

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

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

1.检查数据库是否挂掉

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

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

select * from information_schema.innodb_trx;


image.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


image.png

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

今天mysql遇到的问题的分享到此结束;
原文作者技术博客:https://www.jianshu.com/u/ac4daaeecdfe
95后前端妹子一枚,爱阅读,爱交友,将工作中遇到的问题记录在这里,希望给每一个看到的你能带来一点帮助。
欢迎留言交流

上一篇下一篇

猜你喜欢

热点阅读