支付系統的核心無疑就是充值、扣費、轉賬。
假設現在是乙個這樣的賬戶表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 資料流圖包含使用者,業務和資料。不同的使用者有不同的業...