支付系統資料庫設計的關鍵問題

2021-08-25 07:00:10 字數 1358 閱讀 8275

支付系統的核心無疑就是充值、扣費、轉賬。

假設現在是乙個這樣的賬戶表account(innodb):

filedtypeinfo

idbigint

使用者id

balance

decimal

餘額update_time

datetime

資料更新時間

充值的時候那麼下面這條語句就可以解決:

update account set balance = balance + 10.00, update_time = now() where id=1;

但是扣費和轉賬這種操作就比較麻煩了。不是下面這條語句就可以解決的:

update account set balance = balance- 10.00, update_time = now() where id=1;

我們首先得判斷賬戶餘額是否足夠,不夠的話當然不能扣費,這意味著在update之前還得select一遍。也就是:

1.select from account where id=1;

2.程式判斷balance是否足夠

3.update account set balance = balance- 10.00, update_time = now() where id=1;

但是這個餘額判斷過程在高併發不加鎖的情況下是不可靠的。

我們下面只討論下面的情況:

扣費考慮到併發扣費的情況,允許讓其併發扣費,但是不應該允許賬戶餘額為負數。

轉賬的話也是一樣,相當於先從乙個賬戶扣費,再給另乙個賬戶充值,在乙個事務內完成。

使用儲存過程來解決問題:

create procedure balanceaccount_balance_dec ( in_money decimal(8,2), in_uuid bigint, out status int ) begin declare from_account_balance decimal(8,2); start transaction; select balance into from_account_balance from account where uuid = in_uuid for update; if from_account_balance>=in_money then update account set balance = balance - in_money , update_time = now() where uuid = in_uuid; commit; set status=1; else rollback; set status=0; end if; end;

這樣的話可以保證在更新時不會出現餘額為負數的情況。

分布式資料庫中的關鍵問題 delphi

一 d 的配置 xp作伺服器 1 執行 nt伺服器上的 d fg 程式,進行 d 配置。2 進入 d 的總體預設屬性頁面,將 在這台計算機上啟用分布式 打上勾,將預設身份級別改為 無 3 進入d 的總體預設安全機制頁面,確認預設訪問許可權和預設啟動許可權中的預設值無 everyone 如果不去掉 e...

規劃資料倉儲的關鍵問題

規劃資料倉儲應該從透徹的了解資料倉儲的關鍵問題開始。關鍵問題的答案對於規劃和成功完成資料倉儲至關重要。價值和期望 首先,在企業文化和當前需求的背景下,確定資料倉儲是最可行的解決方案 然後,在確定解決方案的是合適的之後,需要計算它帶來的收益和價值。列出乙個現實的價值和期望清單作為全部規劃過程的一部分,...

系統的資料庫設計

一般的系統,如果不涉及複雜的頁面展示或是演算法實現,其實就是簡單的增刪改查,那麼資料庫設計就很基礎和重要了。剛看了一本關於用powerdesigner做資料庫設計的書,簡單分享下大致的步驟。一,資料流圖dfd data flow diagram 資料流圖包含使用者,業務和資料。不同的使用者有不同的業...