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