程序出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,一定是环境的锅!相关推荐
- 当程序出Bug时,程序员最喜欢说的30句话
又快到周日时间,今天来个轻松娱乐的话题,当程序出Bug时程序员最喜欢说的30句话 1.在我的电脑上是正常的啊... (环境问题,不关我的事) 2.不可能出现这种情况的 (操作方式有问题) 3.快了,已 ...
- 微信翻译出Bug上热搜,程序员又背锅?
作者| 伍杏玲 来源 | 程序人生(ID:coder_life) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_source=cxrs_ ...
- 微信翻译生日快乐的代码_微信翻译出 Bug 上热搜,程序员又背锅?!
天撸了!昨天微信翻译因为出Bug被网友送上热搜,网友质疑微信在翻译明星内容时,结果是近乎"恶搞". 当输入:"you play basketball like caixu ...
- 微信翻译出 Bug 上热搜,程序员又背锅?!
天撸了!昨天微信翻译因为出Bug被网友送上热搜,网友质疑微信在翻译明星内容时,结果是近乎"恶搞". 当输入:"you play basketball like caixu ...
- 背锅侠?程序出现bug是测试/开发工程师水平有限导致的?我只是个搬砖的......
目录:导读 前言 一.Pytest自动化框架 二.Web自动化测试 三.Appium自动化 四.Robotframework 五.接口自动化测试 六.JMeter接口测试 七.Postman接口测试 ...
- 运行个Hello Word也能出Bug?Python、Java、C++等16种语言中枪,最严重可导致文件丢失...
博雯 发自 凹非寺 量子位 | 公众号 QbitAI 一句最简单的Hello World,居然也会出Bug? 倒不是这句代码还能写错,而是运行时找到了许多操作系统对异常处理的漏洞. 在向/dev/fu ...
- 微信小程序 一 小程序的创建、宿主环境、常用组件、开发上线等
小程序简介 1. 小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 API 不同 由于运行环境的不同,所以小程序中, 无法调用 DOM 和 BOM 的 API. ...
- 线上出bug了?别怕,这么定位!
小编推荐: Fundebug提供JS.微信小程序.微信小游戏,Node.js和Java错误监控.真的是一个很好用的错误监控服务,众多大佬公司都在使用. 摘要: Source Map还是很神奇的. 原文 ...
- 从入门到入土:nmap出击:使用nmap扫描某台靶机,给出并解读靶机环境的配置情况
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
最新文章
- SpringBoot整合Shiro安全框架完整实现
- 鸡啄米vc++2010系列32(标签控件Tab Control 下)
- 精细化容量管理的设备成本优化之路
- 飞鸽传书完全不知道这是什么
- Lake Counting(信息学奥赛一本通-T1249)
- 非常简洁漂亮的博客导航页带自适应
- Nexus启动失败处理:The nexus service was launched, but failed to start.
- Django自定义分页、bottle、Flask
- 数学建模学习笔记:层次分析法
- 【资源分享】Dll Injector(DLL注入器)
- Intellij IDEA--配色方案/主题/风格/样式--自定义/配置
- 基于SSM+VUE的交通事故案例库系统(前后端分离)
- 计算机毕业设计springcloud基于微服务的家居体验平台的设计与实现
- 需求调研中要注意的三点
- java粒子特效_程序员20分钟搞定粒子效果, 仅仅200行代码
- MongoDB的多表关联查询
- 六月集训(第21天) —— 堆(优先队列)
- 数通基础-二层交换原理
- Android中LaunchMode详解
- 使用JavaScript实现GPA计算器(学科实践任务 一)
热门文章
- 安卓相机 高帧率_Android MediaCodec和摄像头:如何实现更高的帧速率从相机获取帧原始数据?...
- delphi 软件在线人数统计_8款值得学习的科研论文作图软件
- # 2019-2020.3 《java程序设计》第一周学习总结
- Codeforces936C. Lock Puzzle
- 异常处理、socke基于TCP协议编程
- Java捕获并处理线程失败抛出的异常
- JavaScript中的的面向对象中的一些知识
- hdu 3480 斜率dp
- HTFS.Software.v7.3-ISO 1DVD(传热模拟,最新完全解密版)
- CVE(Common Vulnerabilities and Exposures通用漏洞披露)笔记