最近修改的几个 bug,问题不大,查找起来却几番周折,汇总起来如下。

1.诡异电话号码

客服邮件反馈,很多用户服务热线变成了“0371-45875487”。看到这问题的第一反映是可能因为程序某个地方有人不小心写死了“0371-45875487”,因为服务热线对应数据库为一个字段ServiceTelephone,自然的把“0371-45875487”想象成了一个整体,在web解决方案中查找关键字“0371-45875487”,没有结果,数据库存储过程查找一遍,也没有结果,思路中断了,就先把数据处理了下,原因待查。

没几天,客服又反馈用户服务热线好多又变成了“0371-45875487”,再次超找问题,方式和上次一样,只是搜索关键词变成了“45875487”,没想到很顺利的定位到了问题。出现问题是在个人资料修改页,截取部分代码如下:

                   <tr>
<td align="right" valign="middle" bgcolor="#F9F9F9">
服务热线:</td>
<td align="left" valign="middle">
<input name="mendiantelephone1" type="text" id="mendiantelephone1" style="width: 30px;"
value="0371" size="4" maxlength="5" runat="server" />
-
<input name="mendiantelephone2" type="text" id="mendiantelephone2" style="width: 50px;"
value="45875487" maxlength="8" runat="server" /></td>
</tr>

资料修改aspx代码

                if (!string.IsNullOrEmpty(AgentInfo.MendianTelephone))
{
mendiantelephone1.Value = AgentInfo.MendianTelephone.IndexOf("-") < ? "" : AgentInfo.MendianTelephone.Substring(, AgentInfo.MendianTelephone.IndexOf("-"));
mendiantelephone2.Value = AgentInfo.MendianTelephone.IndexOf("-") < ? AgentInfo.MendianTelephone : AgentInfo.MendianTelephone.Substring(AgentInfo.MendianTelephone.IndexOf("-") + );
}

资料修改aspx.cs代码

如果用户原来没有填写服务热线,在修改页这两个控件的值默认成了“0371”和“45875487”,用户好不知情的情况下把自己的服务热线修改错了。问题修改也很容易,直接把默认值去掉即可。

这问题告诉我们看似诡异的问题肯定也有其原因的,查找问题时可以缩小搜索关键词。

2.同名缓存带来的问题

问题描述:惠州房源信息,同一楼盘对应的区县、商圈竟然出现了不同值,如小区三千俊林对应的区县商圈出现了两组“惠州 惠阳区”和“惠阳 淡水"。查找原因原来是用到了同名缓存造成的,代码如下:

        /// <summary>
/// 根据newcode 获取楼盘字典信息
/// </summary>
public DataTable GetBuildingDicByNewcode(CityBase citySite, long newcode, string projtype)
{
DataTable dt = new DataTable();
string oewname = "districtinfo_bus_around" + newcode.ToString() + "_" + projtype + "new";
string cachename = CacheType.housedic + "_" + oewname; //先取数据缓存
if (this.MemCache.KeyExists(cachename))
{
dt = this.MemCache.Get<DataTable>(cachename);
}
else
{
dt = buildingErrorData.GetBuildingDicByNewcode(citySite, newcode, projtype);
this.MemCache.Set(cachename, dt, DateTime.Now.AddDays());
}
return dt;
}

区县商圈都是根据楼盘编号获取的,而楼盘编号在全国都是唯一的,不会重复,这段代码看似没什么问题,那问题在哪呢?原来还有一个异地楼盘业务,就是深圳可以调用惠州的楼盘,调用的时候惠州就成了深圳的区县了,相当于深圳和惠州同一楼盘的区县商圈属性不同。

这问题出现是因为新业务的出现造成了老代码出现问题,新做业务时方方面面得考虑周全才行。

3.重复提交问题

问题描述:在用户进行放心房操作时,有个计数的字段,每设置一条计数字段+1,每取消一次计算字段-1,但这计数字段却出现了负数的情况。查找问题,最终出现在了用户重复提交上,而且从数据上看是有用户发现了这一漏洞,恶意提交了数据。

        public bool CancelRealHouse(CityBase citySite, HouseOptEntity optEntity, HouseType htype = HouseType.Sale)
{
//刷新房源并设置标签
rowCount = houseDAO.UpdateRealHouseStatus(citySite, htype, optEntity.AgentId, optEntity.HouseIds, string.Empty, false); //调整操作数,只有设置上了放心房标签才会去调整
if (rowCount > )
{
this.houseBizMember.AgentPowerUsingBiz.HouseAction(citySite, htype, HouseAction.UnRealHouse, optEntity.AgentId, rowCount, rowCount, );
}
} public int UpdateRealHouseStatus(CityBase citySite, HouseType houseType, int agentId, List<int> houseIds, string infoCode, bool isSet)
{
int retVal = ;
int isRealHouse = isSet ? : ;
DBHelper db = DBHelper.GetDBHelper(BusinessType.AgentHouseWrite, citySite, agentId);
string tableName = GetTableName(citySite, houseType, true);
string refTableName = GetRefreshTableName(citySite, houseType);
string houseIdsStr = string.Join<int>(",", houseIds);
string sql = sql = string.Format("update {0} set isRealHouse = {1} where agentid={2} and status = 1 and isRealHouse != {1} and houseid in ({3});", tableName, isRealHouse, agentId, houseIdsStr);
retVal = db.ExecuteNonQuery(CommandType.Text, sql);
sql = string.Format("update s set s.registdate = getdate(),s.dtimestamp=getdate() from {0} s inner join {1} h with(nolock) on s.houseid = h.houseid where h.agentid={2} and h.[status]=1 and h.houseid in ({3})", refTableName, tableName, agentId, houseIdsStr);
retVal = db.ExecuteNonQuery(CommandType.Text, sql); return retVal;
}

问题出现在函数UpdateRealHouseStatus()上,这个函数执行了两个操作,一个是更新是否放心房,其实这步骤是没问题的,取消状态时,如果原本就是取消状态,这个返回的就是0,但问题出现在第二个操作上,重新给返回值赋值了,致使重复提交了返回值仍然为1,进而造成最终的计数有问题。

这问题告诉我们在重要操作上,一定要做好重复提交的判断。这问题发现的隐蔽性在于一个函数做了两件事,也和函数功能单一化原则相悖,合理的函数代码也有助于降低这种错误的概率。

最近修改的几个小bug的更多相关文章

  1. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  2. Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG

    摘要: 修复2个BUG,请大家及时更新. Fundebug前端异常监控服务 Fundebug是专业的程序异常监控平台,我们JavaScript插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各 ...

  3. (原创)WinForm中莫名其妙的小BUG——ComboBox 尺寸高度问题

    一.前言 使用WinForm很久了,多多少少遇到一些小BUG. 这些小BUG影响并不严重,而且只要稍微设置一下就能正常使用,所以微软也一直没有修复这些小BUG. 本来并不足以写篇文章去记录,但是昨天遇 ...

  4. 从一个小Bug,到Azure DevOps

    1. 一个小Bug 最近和同事提起一个几年前的 Bug,那是一个很小很小的 Bug,没什么技术含量.那时候我刚入职,正好公司卖了一款仪器到某个国家,但是那边说配套的软件运行不起来,一打开就报错.经过排 ...

  5. 解决JqueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug

    前些日子不是在做 使用Jquery-UI实现一次拖拽多个选中的元素操作嘛,在持续完善这个组件时遇到了一个关于拖放排序的bug.今天就着图片和代码重现一下,也顺便告诉大家如何解决这个问题. 首先先上图描 ...

  6. 淘宝WAP版小BUG分析

    前几天发现的一个淘宝WAP版的小BUG,就是用桌面版chrome看的时候产品评价中的图片显示不出来,都是图裂了. 这是什么原因呢?图片为什么会显示不出来呢?淘宝的技术人员.测试人员不可能没发现啊.开启 ...

  7. 关于一个小bug的修正

    python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...

  8. 用 parseInt()解决的 小 bug

    在做轮播模块的时候遇到问题是:你在 连续指示小按钮 时候再去 只有 点击 下一张按钮,出现bug: 指示小按钮的 className 当前显示的 calssName 为 undefined ! // ...

  9. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

随机推荐

  1. JavaScript 鼠标划过 播放音乐。

    '<EMBED style="FILTER: xray()" src="mp3/'+s+'" width=360 height=30 type=audio ...

  2. myrocks之事务处理

    前言 mysql目前支持的事务引擎有innodb,tokudb. rocksdb加入mysql阵营后,mysql支持的事务引擎增长至3个.myrocks目前支持的事务隔离级别有read-committ ...

  3. ASP.NET 4.5.256 has not been registered on the Web server. You need to manually configure your Web server for ASP.NET 4.5.256 in order for your site to run correctly

    Microsoft .NET Framework 4.6安装后,用户可能会在使用Microsoft Visual Studio 创建(或打开现有项目时)网站.或Windows Azure项目时遇到下面 ...

  4. 分享一个异步任务在遇到IO异常时支持递归回调的辅助方法

    public void TryAsyncActionRecursively<TAsyncResult>( string asyncActionName, Func<Task<T ...

  5. Linux 网络编程(多路复用)

    服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/soc ...

  6. Request中的各种方法

    前言 Request中方法众多,对于Java Web程序员来说,种种方法都会在工作中常常用到.Request由于不是JDK的一部分,这些方法的用法也没有专门的API可以查,所以在工作中遇到Reques ...

  7. 一个App完成入门篇(二)-搭建主框架

    通过第一课的学习,你已经掌握了如何通过debug调试器来跟PC上的设计器联调来实时查看UI设计效果.调试代码了,接下来通过一系列的demo开发教学你将很快上手学习到如何开发一个真正的App. 要开发A ...

  8. Github教程(0)

    Git下载:https://git-for-windows.github.io/ 我下载的版本是:Git-2.6.3-64-bit.exe 安装:略 默认选项点击"下一步"即可 安 ...

  9. 在.net中使用aquiles访问Cassandra(二)

    上文中我们已经建立了项目的基本结构,今天实现数据的修改.在NoSQL中,通常添加和修改都认为是对数据的一种Mutation.   1.建立描述修改Row的实体. public class RowMut ...

  10. 细说.NET中的多线程 (三 使用Task)

    上一节我们介绍了线程池相关的概念以及用法.我们可以发现ThreadPool. QueueUserWorkItem是一种起了线程之后就不管了的做法.但是实际应用过程,我们往往会有更多的需求,比如如果更简 ...