在工作中,经常需要写充值这样的功能,这个功能无非是要做下面四件事:
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) 编辑 收藏 所属分类:
其它