程序出Bug,一定是环境的锅!
現象
前幾天,一個客戶反映說,他看到的數據順序是亂的,不是按照日期倒排。
但是在測試環境、預生產環境,都無法重現問題,即使使用相同的程序版本。
定位
查看代碼,出問題的功能使用了第三方ORM框架,無法看到實際執行的SQL。
于是,使用SQL Server Profiler(正式服務器沒有權限安裝軟件,只能在測試環境使用)跟蹤定位到具體的SQL,拿到正式服務器上運行。問題重現了。
由于數據需要分頁顯示,于是ORM框架實際使用了ROW_NUMBER實現:
SELECT?TOP?(20)?T.ROW_NUMBER_0,T.xxx?FROM?(SELECT?xxx,ROW_NUMBER()?OVER(ORDER?BY?DateField?DESC)?AS?[ROW_NUMBER_0]? FROM?A??WHERE?xxx)?AS?[T]?WHERE?[T].[ROW_NUMBER_0]?>?0而造成問題的原因就在于,返回的結果不是按ROW_NUMBER_0排序的。
分析
查看微軟官方文檔,沒有說明要指定排序:
對結果集的輸出進行編號。具體來說,返回結果集分區內行的序列號,每個分區的第一行從 1 開始。
看它的意思,返回的編號應該是排序好的。
而且,它自己給的示例也是不指定排序的?
這就造成ORM框架實現時沒有考慮要指定排序。
結論
解決方案也很簡單:指定按RowNumber排序。
后來檢查發現,前方是Microsoft SQL Server 2012 (SP1),而測試環境用的是Microsoft SQL Server 2014。同樣的SQL,運行效果不一樣。GOOGLE了一下,也沒發現有相關Bug的內容。
順便測試了一下EF CORE,它是用OFFSET @P_0 ROWS FETCH NEXT @P_1 ROWS ONLY方式實現的分頁,應該不會再有這個問題了。
最后,提醒大家趕快把測試和生產環境配置統一,避免踩和我同樣的坑!
歡迎關注我的個人公眾號”My IO“
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的程序出Bug,一定是环境的锅!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么选择ASP.NET Core
- 下一篇: 把HttpClient换成IHttpCl