隨筆-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 小米 閱讀(507) 評論(0)  編輯  收藏 所屬分類: 其它
          主站蜘蛛池模板: 临夏市| 花莲县| 海丰县| 峨边| 寿宁县| 台中市| 体育| 新闻| 曲靖市| 嘉峪关市| 镇安县| 泸西县| 桐梓县| 临泽县| 罗田县| 峡江县| 余庆县| 日照市| 裕民县| 化州市| 宁波市| 瑞丽市| 吴川市| 长阳| 昆山市| 广水市| 垣曲县| 济宁市| 乾安县| 池州市| 仪陇县| 措勤县| 承德县| 水城县| 建水县| 麻栗坡县| 浪卡子县| 兴仁县| 桃江县| 固始县| 界首市|