萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

積分獲取與消費存儲過程設計實戰(SQL Server)

資料模型

  • GM_JF:客戶總積分表
  • GM_JF_DETAIL:積分明細流水表
  • GM_JF_ACTION_RULES:積分動作規則表(週期、頻次限制)
  • GM_JF_GOODS_RULES:積分商品兌換規則表

核心存儲過程:sp_GM_JF_AddScore

功能:新增積分,含重複獲取檢查、事務保證一致性。

參數

參數型別說明
@ACCOUNT_IDvarchar(30)帳戶 ID
@JF_CategoryNumbervarchar(15)積分類別編碼
@CARD_NUMint卡號/數量
@HQ_JF_AMOUNTint獲得積分數
@Statevarchar(16)狀態
@USE_DESCvarchar(400)備註
@StatusCodeint OUTPUT0失敗 1成功 2重複

核心邏輯

  1. 讀取規則表取得 RepetitionsCycle(週期天數)與 RepetitionsFrequency(週期內最大次數)。
  2. 統計明細表在週期內該帳戶、該類別的實際獲取次數 @realFrequency。
  3. 若 @realFrequency >= @repetitionsFrequency 則回傳狀態碼 2(重複獲取),終止。
  4. 開啟事務:
      a. 寫入明細表 GM_JF_DETAIL
      b. 檢查總積分表 GM_JF 是否存在該帳戶:
        不存在 → 插入新行(總積分=可用積分=本次獲得)
        存在 → 更新總積分、可用積分、版本號、更新時間
      c. 提交事務,回傳狀態碼 1。
  5. 錯誤處理:@@ERROR <> 0 時回滾,回傳 0。

關鍵程式碼片段

-- 週期換算(天/秒)
IF @repetitionsCycle < 1
    SET @repetitionsCycle_second = (@repetitionsCycle - 1) * 86400;
ELSE
    SET @repetitionsCycle_second = (@repetitionsCycle - 1) * 86400; -- 實際邏輯需細化

-- 統計實際頻次
SELECT @realFrequency = COUNT(1)
FROM GM_JF_DETAIL
WHERE ACCOUNT_ID = @ACCOUNT_ID
  AND JF_CategoryNumber = @JF_CategoryNumber
  AND USE_DATE BETWEEN DATEADD(second, -@repetitionsCycle_second, @USE_DATE) AND @USE_DATE;

-- 事務與版本號樂觀鎖
BEGIN TRAN;
INSERT INTO GM_JF_DETAIL ...;
INSERT INTO @temp_table SELECT ... FROM GM_JF WHERE ACCOUNT_ID = @ACCOUNT_ID;
IF (SELECT COUNT(1) FROM @temp_table) = 0
    INSERT INTO GM_JF ...;
ELSE
    UPDATE GM_JF SET
        JF_AMOUNT = JF_AMOUNT + @HQ_JF_AMOUNT,
        TTL_JF_AMOUNT = TTL_JF_AMOUNT + @HQ_JF_AMOUNT,
        Last_Update_Time = GETDATE(),
        [Version] = [Version] + 1
    WHERE ACCOUNT_ID = @ACCOUNT_ID;
COMMIT TRAN;

設計亮點

  • 表變量 @temp_table 暫存舊值,避免多次查表。
  • 版本號 [Version] 實現樂觀鎖,防止併發更新丟失。
  • 規則驅動:週期與頻次可配置,無需改代碼。
copyright © 萬盛學電腦網 all rights reserved