博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决数据库卡死问题
阅读量:4705 次
发布时间:2019-06-10

本文共 703 字,大约阅读时间需要 2 分钟。

       今天在项目中,遇到了棘手的问题,在跟第三方通信过程中,本来好好的,突然就接收不到tcp发来的数据了。重启之后正常。

       第一感觉,当然是怀疑第三方的问题,毕竟自己写的代码是亲生的。而且自己的架构也十分简单,接收数据,操作数据库,回复包而已。

       接收到的任何数据都会第一时间打日志,既然没有日志,当然是第三方没有发送啦! 可是第三方有5个客户端,同时都接收不到数据,自己写的代码问题明显嫌疑度急剧上升。

 

       通过查看日志,发现在接收不到数据之前有大量的业务失败日志(检测器心跳失败)。由此怀疑是不是检测器心跳失败造成的线程堵死,等到每个线程都堵死了,自然就接收

       不到数据了。然后翻看业务代码。大概的处理是这样的

       update ***

       if(sqlfail)

      {

               rollback

               return false;

       }

       select***       

       if(sqlfail)

     {

               rollback

               return false;

     } 

     if(!next)

    {

              return false;

     }

     update***

     ...

     commit

     通过模拟数据执行sql,发现是select查询的是空数据然后return false返回的,导致update造成的独占锁一直没有释放。

     好家伙,那别的线程凡是处理到这张表统统堵死,慢慢的导致全部线程堵死啦,哈哈,再也接收不到数据了。

 

     经验教训:在业务逻辑复杂的函数里,如果先前有update/insert/delete 等修改表的操作,在异常退出的时候一定要记得commit或rollback,释放独占锁。     

    

          

            

转载于:https://www.cnblogs.com/xuhuajie/p/6860601.html

你可能感兴趣的文章
nodejs+redis使用
查看>>
prime算法的使用
查看>>
Jedis - hello world
查看>>
Ehcache(2.9.x) - API Developer Guide, Cache Eviction Algorithms
查看>>
把最近这些安全的问题整理一下
查看>>
【转】如何避免OOM总结
查看>>
java 类与对象
查看>>
git push 每次都要输入用户名密码
查看>>
远程桌面无法复制粘贴
查看>>
对错排认识。
查看>>
js高级程序设计——数据属性和访问器属性
查看>>
ArcGIS客户端API中加载大量数据的几种解决办法(以Silverlight API为例)
查看>>
C# App.config 自定义 配置节
查看>>
Windows PowerShell
查看>>
几道前端的面试题
查看>>
进程间通信的四种方式
查看>>
Sentinel系统监控Redis主从节点
查看>>
Java设计模式之《享元模式》及应用场景
查看>>
TX2安装QT
查看>>
PHP使用curl替代file_get_contents
查看>>