IE 访问服务器页面调试显示挂起,数据提交一直在挂起状态(IE显示请求挂起)...

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

4855ad67b471592fad06815fe0ca69ee.png

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

8c4b2113775bda95579e10c8d44c3a78.png

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

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

d55c37aad5dd7886e77354f83bfebdfb.png

各种锁,看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则会被堵塞住

35d8226f925068c941c19fecb6e129a6.png

f57ac549873fa44f01eb2bf75c0eb07b.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值