解决数据库卡死问题

今天在项目中,遇到了棘手的问题,在跟第三方通信过程中,本来好好的,突然就接收不到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,释放独占锁。

时间: 2024-10-11 23:16:01

解决数据库卡死问题的相关文章

使用Source Safe for SQL Server解决数据库版本控制问题

简介 在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多个版本,而不会将代码库变得混乱,典型的场景包括Bug修复.添加新功能.版本整合等. 虽然在开发层面的版本控制软件已经非常成熟,但目前国内还没有专门针对数据库层面的版本控制软件来帮助不同角色的人员在数据库层面进行团队协作.变更代码管理以及对数据库的变更进行查看和比对.在数据库层面版本控制工具的缺乏可能会出现如

解决数据库SUSPECT(置疑)状态

在虚拟机中运行数据库不小心强制关机了,结果有一个重要的数据库后面加上了一个suspect的关键字,在管理器中打不开,程序也不能运行. 网上有很多分析的方法,试了一些不管用,最后用这种方法解决了,记录一下. 执行下面的代码,其中DbTest就是出问题的数据库. EXEC sp_resetstatus 'DbTest'; ALTER DATABASE DbTest SET EMERGENCY DBCC checkdb('DbTest') ALTER DATABASE DbTest SET SINGL

大开测试:性能—如何解决数据库查询结果过大导致录制失败(连载3)

7.3  如何解决数据库查询结果过大导致录制失败 1.问题提出 在进行一个进销存管理应用系统测试过程中,发现在进行查询后,由于查询结果数据记录条数过多,而引起后续脚本无法继续录制. 2.问题解答 我们在测试过程中发现,很多设置和数据库应用相关.这个问题的解决方法可以通过设置Vugen.ini的CmdSize项完成. Vugen.ini文件存放于Windows系统目录下,首先查找是否在该文件中存在"[SQLOracleInspector]"项,并且查看是否已经存在"CmdSiz

mysql进阶(二十五)解决数据库NO CONNECTION问题

解决数据库NO CONNECTION问题 前言 数据库版本类型:Mysql5.5 在应用程序连接数据库时,提示数据库连接失败.打开数据库查看,显示如下. 究其原因,是因为mysql服务出现了问题,重启mysql服务,数据库成功连接. 参考文献 1.http://jingyan.baidu.com/album/0a52e3f4158211bf62ed72e6.html?picindex=1 美文美图

桦仔 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题

1 --检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 2 --注意:重新链接只能链接SQL登录帐号,不能链接Windows登录帐号 3 --如果不选择重新链接可以使用备份master数据库的方法还原到新的服务器上,可以避免一个数据库有 4 --成千上百个数据库用户的情况 5 SELECT * FROM sys.server_principals 6 SELECT * FROM sys.database_principals 7 8 --检测孤立用户 9 USE GPOSDB

sql点滴39—解决数据库日志文件过大的问题

原文:sql点滴39-解决数据库日志文件过大的问题 随着数据库使用时间增长,日志文件也在不停的增大,这里介绍几种方法减小这个文件的方法. 1.直接删除log文件 分离数据库.分离数据库之前一定要做好数据库的全备份,选择数据库——右键——任务——分离,如下图 将日志文件和数据文件复制粘贴到另外一个文件夹中以防万一.删除链接,如下图 直接删除日志文件,然后再附加数据库,如下图 附加的时候会自动将ldf文件和mdf文件都附加上,但是会提示找不到ldf文件,没关系,选中ldf文件这一行,点击下面的删除按

Java程序中解决数据库超时与死锁

Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决.本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念. AD: Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避

解决数据库高并发

解决数据库高并发的常见方案: 1) 缓存式的 Web 应用程序架构: 在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数 据读取速度.cache 存取的媒介是内存,可以考虑采用分布式的 cache 层,这样更容易破除内存容量 的限制,同时增加了灵活性. 2) 增加 Redis 缓存数据库: 把经常访问到的数据而且不需要经常变化的数据放在缓存中. 主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减少数据库的压力. 第一获取数据从数据库中提取

Oracle 创建数据库卡死在85%

Oracle 创建数据库卡死在85%处理方法 1.首先用改工具,删除数据库 2.对应的目录 3.重启服务器(本次尝试有重启,在有其他数据库在跑的情况下,可以试试不重启) 原文地址:https://www.cnblogs.com/chengeng/p/10218398.html