昨天写代码的时候,一段原本运行的很好的代码,忽然之间就出了诡异的问题了:在service层的方法中,有一条插入数据库的语句,一条更新数据库的语句(不是同一张表),如果不出异常就返回true,出异常就返回false。症状是:执行完return true之后,即使放过断点,程序也不动了,不继续执行调用他的方法。
我开始的时候以为是IDE的问题,或者是tomcat缓存的问题,于是重新编译了下项目,把tomcat下相关的东西也都清空了,发现还是不好用,本着节约时间的原则,请来同事帮忙。
同事开始的时候,也是向我一样,重新编译,清空……,发现也不好用。经过一系列折腾之后,同事注释掉了service层方法中的那条更新数据库的语句,只运行插入数据库的语句,OK,一切正常。这时候,我好奇心起来了,把插入语句注释掉,只执行更新语句,发现症状又出来了。
这时候基本就可用认为是更新的部分出问题了,于是同事让我把hibernate打印出的SQL放到PL/SQL里面去执行(话说我从来没想过要把更新语句放到PL/SQL里面去执行,更新语句还能出错?),我俩大眼瞪小眼的看了半天,也没发现那条SQL的问题,但是放到PL/SQL里面执行的时候,却死活都是执行中的状态,没个结果。后来终于想到,难道是锁表了?
于是我让DBA帮查下这个表是不是被锁住了?DBA一看,果然被锁了,而且还是N多没有commit的,让DBA杀死这些死锁之后,再运行程序,果然正常了。
同事跟我说:“你去买块豆腐吧”。
只是我想了一个晚上,也没想到这个死锁是怎么开始的呢?
总结:
1、遇到问题不要慌张,不要紧张,不要因为诡异的,自己没见过的问题就认为自己解决不了。这个问题其实是个很简单的问题。
2、多问问同事也是好的,有利于节省时间,不过不能解决了就解决了,还得自己总结总结,否则下次出现类似的问题还是不会解决。
3、我之前已经基本不怕系统报告的异常了,但是昨天碰到这种什么反映都没有的情况着实还是怕了一下。以后争取不怕任何问题。
一篇关于在服务层方法中执行数据库操作导致程序停滞的文章,通过排查发现是由于更新语句引发的死锁问题。
1340

被折叠的 条评论
为什么被折叠?



