今天发生了一件让人感觉不可思议的事情。我有个站,会员用支付宝在线充值后,居然重复入账两次。而我在支付宝充值成功后的返回文件中已经写了判断语句,如果入库前查询到该订单号存在于表中,就拒绝入库。奇怪的是,今天居然有人充值一次,却两次入库。等于说这个人充了100元进来,结果系统给他加了200元。为什么加了判断词句还存在这样的情况呢?后来,我就加会员充值记录的表中的订单号(这个是唯一的)设为了“唯一”属性。因为这个订单号是支付宝的交易号,肯定是唯一的。这样以后是不是不会再发生同充值一次,入库两次的记录了呢?或者大家有什么好的方法学习一下。

解决方案 »

  1.   

        加了unique以后还出现过这种情况没。我觉得估计是你UPDATE的时候,数据库有2个地方有同一个订单号。这样的话UPDATE以后,就等于更新了2个地方,叠加以后100就变成200,如果有3个地方,也许就是300了!问题起源我觉得还是在于表的设计上。也就是插入部分就是有分歧的。具体情况不知道。但是我只是怀疑有这种可能。
      

  2.   

    现在加了unique,还没有出现。订单号插入表之前,我有个语句判断表中是否存在该订单号,如果存在,就不会再插入了。如果不存在,就将订单号插入到充值日志表中,然后再更新会员的余额。这个功能我自己用支付宝充值测试的时候,返回到网站的地址,我直接刷新多次,都没有出现过入库两次的现象,惟独今天凌晨0点的时候。可能今天0点的时候,情况有些特殊。因为每天凌晨,服务器都会进行整站备份,这个时候系统非常繁忙,负载很高,一度达到20左右而我今天凌晨访问网站,慢得要死。而正在此时,有个会员充值了,我怀疑mysql数据库在操作的时候,会不会和系统繁忙有关呢?导致灵异事件发生。
      

  3.   

    unique之后应该会正常,如果再不正常,就是数据库的bug了。
      

  4.   

      现在加了unique,还没有出现
      惟独今天凌晨0点的时候。

    加了唯一后,出现还是没出现呢?惟独?
      或者你的数据库有没有加额外的事务处理!
      

  5.   

    lz的意思是说,之前发生这情况的时候,数据库字段没设置unique,而只是用php自行判断了一次。
    在发生情况后才设置unique的。