2017年12月5日 星期二

[SQL Server] 案例分析 : 用IF EXISTS來進行交易的判斷真的沒有問題嗎?

案例情境
近幾天檢查資料庫客戶資料時意外發現有客戶的帳戶餘額為負值,這對公司來說是一個非常致命的錯誤,事關到公司營收。
便開始檢查是否被鑽了漏洞或者程式有邏輯錯誤。







在逐筆確認了交易的Log後,發現客戶的提款動作在短時間內重覆了兩次





此時心中開始咒罵 : 一定是哪個傢伙沒確認餘額狀況,就讓客戶可以領錢
於是乎去檢查了提款的Stored Procedure,發現以下這段邏輯

IF EXISTS(
    SELECT 1
    FROM dbo.MemberAccount
    WHERE MemberID = @MemberID
          AND ActualBalance >= @TransferAmount
)
BEGIN
    UPDATE dbo.MemberAccount
    SET ActualBalance = ActualBalance - @TransferAmount
    WHERE MemberID = @MemberID
END