数据提交一直在挂起状态(IE显示请求挂起)

坚强是说给别人听的谎言 提交于 2019-11-30 16:50:23

 最近忽然发现项目提交的时候一直在提交状态,不能提交成功,客户反馈提交了4个多小时还在提交中,应用也没发现什么明显错误,前台显示如下(IE下才会有这种提示,其他的浏览器没错误):

刚发现该问题的时候,网络查了一遍基本没发现靠谱的,倒是看到一个有意思的

按照这位大佬的方法修改了,依旧还是无法提交,请求一直在挂起状态,程序中的各种页面跳转没有任何问题,就是在提交的时候无法提交成功,找了一两天,感觉不是程序的问题,将目光转向数据库。

  发现数据库一堆锁表,问题终于确定是数据库锁表导致提交不成功的,使用工具查询

各种锁,看sql是一条查询语句很久没出结果,而这个查询语句锁了表。

在印象中锁表一直都是插入和更新才锁表,而且还是行锁,查询也会锁表,赶紧补习一下,数据库的锁有很多种,但大致可以分为S锁(共享锁)以及U锁(排他锁),查询的时候会加上S锁,S锁对其他的查询无影响,但是插入和更新则会因为这个锁导致无法插入和更新,而这个sql查询统计的时候耗时非常久,故而导致了整个应用出现问题。根据工具排查出某个古老的应用在进行这个查询,临时先将该应用关闭,恢复正常的业务。

  但问题还是要解决,总不能一直关闭那个老应用吧,暂时给出的方案:

 1,对表增加索引,让查询更快点

 2,对查询语句进行修改,加上 WITH(NOLOCK) 来去掉这个共享锁,当然这也会产生其他问题,比如脏读问题,具体还是要看各自的业务,我这里这个查询并不影响,直接加上 WITH(NOLOCK) 即可,就不会影响插入更新了。

 另外补充点:加了nolock其实还是有锁的, 很多人误以为使用了WITH(NOLOCK)后,数据库库不会产生任何锁。实质上,使用了WITH(NOLOCK)后,数据库依然对该表对象生成Sch-S(架构稳定性)锁以及DB类型的共享锁 ,这种锁如果你加入了新的列,而这个插入新列还是事务中,你会发现查询又会有阻塞,但实际这已经没影响了。

另外补充点小知识:

查询的时候是行锁还是表锁?

以mysql为例,有索引并且使用了该索引当条件的时候就是行锁,没有索引的时候就是表锁。innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的。看到这里应该明白了吧,其实加索引也能解决上面那个查询锁表的问题

更新与插入的时候是行锁还是表锁?

sqlserver增删改数据时候,对表加IX锁,会阻止非脏读查询,但是不会阻止其他的不同记录的增删改,但是如果执行select则会被堵塞住

查询的时候是行锁还是表锁?

以mysql为例,有索引并且使用了该索引当条件的时候就是行锁,没有索引的时候就是表锁。innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.

更新与插入的时候是行锁还是表锁?

sqlserver增删改数据时候,对表加IX锁,会阻止非脏读查询,但是不会阻止其他的不同记录的增删改,但是如果执行select则会被堵塞住

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!