sqlserver中select造成死鎖

2022-03-08 02:14:59 字數 1554 閱讀 4639

專案上線,準備驗收前出現了乙個嚴重的問題:很多select語句作為死鎖的犧牲,大部分報表無法開啟。這個問題影響範圍很大所有的報表都無法訪問,而我們的報表是放在電視上面輪播的,電視放在工廠裡面,所以出現問題後,整個工廠都知道了。

解決這個問題比較曲折,首先是寫sap介面的同事發現了問題:sap一直在傳錯誤資料導致產量表被鎖住。修改sap傳輸的錯誤資料後,這個死鎖的問題沒有出現了。但是我檢視生產環境伺服器日誌的時候,發現這個問題依然存在,由於客戶沒有提這個問題,我也就是沒有理由要求花時間修改了,因為我還有其他專案在忙。

問題始終存在,它的暴露只是時間問題。過了一周,在我們要談專案驗收的時候,這個問題又暴露出來了。因為影響非常大,給客戶造成不好的印象。所以修改這個問題得到了老闆的支援,說實話,我也頭一次遇到這樣的問題,也想不通select語句怎麼就死鎖了。我知道這個問題很頭疼,好在得到老闆的支援,會給足夠的時候我來解決問題,我也就有信心了。

在網上找了很多文章,我的解決思路是:通過查詢語句查詢死鎖相關的sql語句,只發現了被犧牲的那條sql語句,另外一條sql語句沒有找到,這條路走不通。接著就是重現問題,然後解決問題。這條路剛開始也走不通,也行不通,重現了乙個下午有沒有發現問題。在快下班的時候,我迷茫了。第二天又網上找了半天資料,這個時候想到用sql server profiler去監聽資料庫,悲劇的是客戶那邊放假了,連不到出問題的生產環境資料庫。接著跟同事聊這個問題,他給的建議依然是重現,然後記得有個方法可以重現,這個時候我才猛然想起來了有這檔子事。

重現方法是有sql語句迴圈往產量表插入資料,由於報表大多讀取產量表,然後報表就經常死鎖。這個時候我看到希望了,只是不理解select語句怎麼會引起死鎖,後來在網上認真讀了一篇文章:sqlserver中select語句引起的死鎖(讀懂這篇文章後我覺得跟我遇到的情況非常相似。

通過他的理論我分析了下死鎖過程:

於是只要讓查詢語句加共享鎖就解決問題了,sql server行版本級別控制能解決我的問題。

使用基於行版本控制的隔離級別:當在基於行版本控制的隔離下執行的事務讀取資料時,讀取操作不會獲取正被讀取的資料上的共享鎖(s 鎖)

找到最快設定行版本級別的方法:

if(charindex('microsoft sql server 2008',@@version) > 0) 

begin

declare @sql varchar(8000)

select @sql = '

alter database ' + db_name() + ' set single_user with rollback immediate ;

alter database ' + db_name() + ' set read_committed_snapshot on;

alter database ' + db_name() + ' set multi_user;'

exec(@sql)

end

很神奇,這樣設定後,死鎖的問題就不存在了。

查詢是否設定成功:

select is_read_committed_snapshot_on from sys.databases where name = db_name() 

AlloyTouch之無限迴圈select外掛程式

當滾動的內容很多,比如鬧鐘裡設定秒,一共有60項。讓使用者從59ms滾回01ms是一件很痛苦的事情,所以 在列表項太多的情況下,我們希望能夠有個無限迴圈的滾動。00ms和01ms是無縫鏈結起來的。如下圖所示 先引用依賴的js和css檔案。然後 var i 0,options for i 60 i v...

selec查詢 分頁查詢及優化

select column,column from table where clause limit n offset m 解析 limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。注意 mysql資料庫中limit分頁查詢...

layui 自動觸發radio和select

layui對radio和select做了包裝,正常用jquery選中後使用trigger不起作用。那麼,怎麼讓其自動觸發呢?對radio來說,必須在 選中後.next layui form radio click 例如 radio checked click 就不行,必須得是 radio check...