1. 判斷是否可以充值;
2. 將充值卡的余額減去充值金額;
3. 將用戶的余額加上充值金額;
4. 寫日志。
在實際的應(yīng)用中,還是有不少地方需要考慮的,主要有以下幾個方面:
1. 這四步中,后面三步都涉及到數(shù)據(jù)庫的操作,所以必須在一個事務(wù)中完成;
2. 后面三步的執(zhí)行順序是需要考慮的,我覺得比較好的順序是這樣的:
a. 寫日志;
b. 將充值卡的余額減去充值金額;
c. 將用戶的余額加上充值金額。
由于寫日志操作是不涉及到金額的,即使失敗了,對系統(tǒng)也沒有什么很大的影響,所以我放在第一步執(zhí)行。至于是先給用戶增加金額還是先減去充值卡的金額,似乎誰先誰后都沒有什么關(guān)系。不過,其實有一個微妙的地方,如果先給用戶加上余額而不幸在減去充值卡的余額時出錯,甚至很不幸數(shù)據(jù)庫也出了問題,沒有回滾事務(wù)。那么就等于用戶平白無故的多了錢,用戶當(dāng)然很高興,也許會投訴,也許不會投訴(是我肯定不投訴,高興都來不及呢

3. 在執(zhí)行更改充值卡的余額時,必須要在數(shù)據(jù)庫中進行加減操作,而且要在數(shù)據(jù)庫中再檢查一遍充值卡的余額是否足夠。執(zhí)行的SQL語句類似下面:
UPDATE card SET card_balance=card_balance-? WHERE card_number=? AND card_balance>=?
由于現(xiàn)在大部分的系統(tǒng)都是多進程或者多線程的,有可能在你提交之前,有其它的進程或者線程更新了數(shù)據(jù)庫中的記錄,所以如果不在數(shù)據(jù)庫中進行加減操作,不再檢查一遍余額是否充足,會給系統(tǒng)帶來隱患。