解决方案 »

  1.   

    出现这种情况感觉不太正常。我觉得最好应该是按照银行的模式来设置。我觉得两地方访问的是不同的表或者实例。
    如果是访问的同一实例,当你刷卡以后,事务提交,数据一致。充值的时候,应该是在历史数据的基础上+50.感觉系统的处理机制的是,每天晚上会将刷卡记录(消费)继续一次处理(数据同步),然后保证数据一致。非常感谢你的回答,但是我发现自己考虑中疏忽了一点,就是在终端进行充值后,可以进行余额的查询,如果不进行提交的话,余额显示应该也不是正确的。
    同同学讨论,猜想这种可能:终端内有一个类似于cache的结构,里面存储的是今天(以天为例进行说明)在终端上进行操作的所有卡的信息,当一张卡首次在终端上进行操作时,终端访问的是源头数据库里的数据,将该条记录取出来,放到终端所谓的cache中,当进行充值操作时,实质是执行了两条数据操作:一条是将cache中的这条记录进行更新,即最开始从源头数据库中的取出的记录值加上充值,这样用来解释充值后,进行余额查询显示结果(但这个结果显示不正确,若充值后进行消费);另外一条是针对源头数据库中数据的更新操作,应该将这两条sql语句放在一个事务控制中。当一天结束的时候,将cache中的记录清空。PS:想请问下你提到的“感觉系统的处理机制的是,每天晚上会将刷卡记录(消费)继续一次处理(数据同步),然后保证数据一致。”的具体措施是什么,方便讲解一下不?明天再去终端查询验证一下,猜想是否正确,还有就是想咨询一下,如果按你的猜想两者访问的不是同一个表的话,那么怎样保证金额字段的一致性?至于你提到的访问的是不同的实例,没能理解你的意思,方便解释一下么?
    3q
      

  2.   

    1. 访问不同的实例应该不太可能,因为那样有点复杂。个人感觉是通过不同的表来控制的,比如现在有2个表 t1--余额表  t2--消费记录表 
    消费的时候,插入消费记录表但是不更改余额表(因为你一天可能频繁的消费,为了避免频繁的余额表进行修改,此时不更新余额表),在消费终端查看数据:余额-当天消费记录(70-8=62)充值时:修改余额表(20+50=70),由于还没有处理消费记录,所以此时的余额表显示的余额还没有去除当天的消费记录。在晚上客户量小的时候,可以将当天的消费记录进行统计(比如当天共消费了20),然后将余额表进行更新(-20)。其实这种机制也是一种cache的机制,只不过是在数据库端通过表来实现的,当然也可以通过程序来实现。