最近突然發現項目提交的時候一直在提交狀態,不能提交成功,客戶反饋提交了4個多小時還在提交中,應用也沒發現什麼明顯錯誤,前臺顯示以下(IE下才會有這種提示,其餘的瀏覽器沒錯誤):mysql
剛發現該問題的時候,網絡查了一遍基本沒發現靠譜的,卻是看到一個有意思的sql
按照這位大佬的方法修改了,依舊仍是沒法提交,請求一直在掛起狀態,程序中的各類頁面跳轉沒有任何問題,就是在提交的時候沒法提交成功,找了一兩天,感受不是程序的問題,將目光轉向數據庫。數據庫
發現數據庫一堆鎖表,問題終於肯定是數據庫鎖表致使提交不成功的,使用工具查詢瀏覽器
各類鎖,看sql是一條查詢語句好久沒出結果,而這個查詢語句鎖了表。網絡
在印象中鎖表一直都是插入和更新才鎖表,並且仍是行鎖,查詢也會鎖表,趕忙補習一下,數據庫的鎖有不少種,但大體能夠分爲S鎖(共享鎖)以及U鎖(排他鎖),查詢的時候會加上S鎖,S鎖對其餘的查詢無影響,可是插入和更新則會由於這個鎖致使沒法插入和更新,而這個sql查詢統計的時候耗時很是久,故而致使了整個應用出現問題。根據工具排查出某個古老的應用在進行這個查詢,臨時先將該應用關閉,恢復正常的業務。架構
但問題仍是要解決,總不能一直關閉那個老應用吧,暫時給出的方案:工具
1,對錶增長索引,讓查詢更快點sqlserver
2,對查詢語句進行修改,加上 WITH(NOLOCK) 來去掉這個共享鎖,固然這也會產生其餘問題,好比髒讀問題,具體仍是要看各自的業務,我這裏這個查詢並不影響,直接加上 WITH(NOLOCK) 便可,就不會影響插入更新了。spa
另外補充點:加了nolock其實仍是有鎖的, 不少人誤覺得使用了WITH(NOLOCK)後,數據庫庫不會產生任何鎖。實質上,使用了WITH(NOLOCK)後,數據庫依然對該表對象生成Sch-S(架構穩定性)鎖以及DB類型的共享鎖 ,這種鎖若是你加入了新的列,而這個插入新列仍是事務中,你會發現查詢又會有阻塞,但實際這已經沒影響了。server
另外補充點小知識:
查詢的時候是行鎖仍是表鎖?
以mysql爲例,有索引而且使用了該索引當條件的時候就是行鎖,沒有索引的時候就是表鎖。innodb 的行鎖是在有索引的狀況下,沒有索引的表是鎖定全表的。看到這裏應該明白了吧,其實加索引也能解決上面那個查詢鎖表的問題
更新與插入的時候是行鎖仍是表鎖?
sqlserver增刪改數據時候,對錶加IX鎖,會阻止非髒讀查詢,可是不會阻止其餘的不一樣記錄的增刪改,可是若是執行select則會被堵塞住
查詢的時候是行鎖仍是表鎖?
以mysql爲例,有索引而且使用了該索引當條件的時候就是行鎖,沒有索引的時候就是表鎖。innodb 的行鎖是在有索引的狀況下,沒有索引的表是鎖定全表的.
更新與插入的時候是行鎖仍是表鎖?
sqlserver增刪改數據時候,對錶加IX鎖,會阻止非髒讀查詢,可是不會阻止其餘的不一樣記錄的增刪改,可是若是執行select則會被堵塞住