两个BUG 一个是linq to sql 并发问题一个是跨年问题

 最近系统中出现两个典型的BUG,记录于此,总结错误,在以后编程中以参考。一个是关于跨年的,一个是关于linq to sql的并发错误的,虽然这些都比较低级,放在关键位置就能导致系统崩溃。

1.       跨年的BUG

事情概况,元旦前一天,即2010-12-31号,有客户投诉说双色球中奖了,我们没有给他开奖。

经过检查发现,我们的程序在2010-12-30晚上11点就开始中奖查询了,去供应商查询开奖号的时候返回结是:

<?xml version="1.0" encoding="gb2312"?>

<Resp errcode="2" errdesc="调用失败" funcid="8301" agent="8888" memo="获取开奖号码" timestamp="1293777440064" />

起初还以为是供应商问题,经过详细检查发现,我们程序在去查询开奖号码的逻辑有错。

供应商的结口需要用彩票种类和开奖期次去查询开奖号,彩票种类没有问题,开奖期次出了错,

开奖期次在同一年内是数据累加的,比如2010-12-31开奖的期次是2010153,前一期是2010152,所以我们程序在查询开奖期次时就是拿着当前可以卖的期次减去1就是上期开奖的号。而2011-1-2号的期次2011001已经是2011年的了,减去1无法得到上期的2010153期。

2.       一个关于Linq to SQL 并发错误的BUG

手机充值程序里有两个timer计时器,一个用于提交订单去充值,一个用于验证订单充值结果,正常情况下,会是提交充值以后5分钟才会验证订单充值状态。

由于提交充值程序里有socket程序,造成一次充值超过5分钟了,socket才有下行包,这时候这笔订单已经被验证程序更新过了,当提交充值程序再次更新数据的时候发现已经被更新过了,便出现了“System.Data.Linq.ChangeConflictException: 找不到行或行已更改。。整个服务程序就陷入死循环状态,不停地提交该笔订单,不停地出这个错,服务停掉,再开启还是如此,要把服务程序卸载再安装才可以。后来将linq to sql 实体的字段属性 Update Check always改成never,在不必要的地方去掉并发处理。

 

 

以上是最近两个比较典型的BUG,都给整个业务造成灾难性的结果

 

posted @ 2011-01-05 15:09  赵一村  阅读(427)  评论(0编辑  收藏  举报