随笔-57  评论-202  文章-17  trackbacks-0
      在工作中,经常需要写充值这样的功能,这个功能无非是要做下面四件事:
      1. 判断是否可以充值;
      2. 将充值卡的余额减去充值金额;
      3. 将用户的余额加上充值金额;
      4. 写日志。
      在实际的应用中,还是有不少地方需要考虑的,主要有以下几个方面:
      1. 这四步中,后面三步都涉及到数据库的操作,所以必须在一个事务中完成;
      2. 后面三步的执行顺序是需要考虑的,我觉得比较好的顺序是这样的:
         a. 写日志;
         b. 将充值卡的余额减去充值金额;
         c. 将用户的余额加上充值金额。
      由于写日志操作是不涉及到金额的,即使失败了,对系统也没有什么很大的影响,所以我放在第一步执行。至于是先给用户增加金额还是先减去充值卡的金额,似乎谁先谁后都没有什么关系。不过,其实有一个微妙的地方,如果先给用户加上余额而不幸在减去充值卡的余额时出错,甚至很不幸数据库也出了问题,没有回滚事务。那么就等于用户平白无故的多了钱,用户当然很高兴,也许会投诉,也许不会投诉(是我肯定不投诉,高兴都来不及呢)。如果是相反的情况,那么用户必然投诉,也就可以发现系统的问题。所以我觉得应该先减去充值卡的余额。
      3. 在执行更改充值卡的余额时,必须要在数据库中进行加减操作,而且要在数据库中再检查一遍充值卡的余额是否足够。执行的SQL语句类似下面:
      UPDATE card SET card_balance=card_balance-? WHERE card_number=? AND card_balance>=?
      由于现在大部分的系统都是多进程或者多线程的,有可能在你提交之前,有其它的进程或者线程更新了数据库中的记录,所以如果不在数据库中进行加减操作,不再检查一遍余额是否充足,会给系统带来隐患。
posted on 2005-05-20 18:19 小米 阅读(493) 评论(0)  编辑  收藏 所属分类: 其它

只有注册用户登录后才能发表评论。


网站导航: