隨筆-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)  編輯  收藏 所屬分類: 其它
          主站蜘蛛池模板: 科技| 夏邑县| 阳城县| 中西区| 丁青县| 理塘县| 滦平县| 凤城市| 云和县| 明溪县| 湘潭市| 札达县| 甘肃省| 神木县| 琼结县| 云安县| 大邑县| 富源县| 资兴市| 康平县| 长武县| 泰安市| 昂仁县| 额济纳旗| 韩城市| 嘉定区| 安岳县| 南京市| 专栏| 清河县| 讷河市| 陆川县| 瑞丽市| 哈尔滨市| 平昌县| 巩义市| 青海省| 民乐县| 昌吉市| 定边县| 遂平县|