用戶投標是P2P網絡借貸系統的核心功能。相對照較復雜,為了更好地梳理業務和技術實現思路,特地具體總結分析下。
輸入:用戶id-uid。標的id-lid。投標金額-amount
1.依據lid,獲得貸款標的信息(優先從Cache中取),不能為null,狀態status應該“合法”。
假設貸款標不存在,或者狀態不正確,馬上返回到前端。不再繼續后面的處理。
2.依據uid。查詢用戶的信息。
貸款標的和用戶信息是投標邏輯須要的。
3.投標檢查。
用戶的賬戶是否存在、賬戶剩余金額是否超過了投標金額amount。
4.依據uid、lid、amount等參數,構造投標tender對象。包括了投標須要的全部信息。
5.獲得投標狀態信息(事務鎖住搶標狀態。防止多個用戶同一時候投標。使用數據庫行級鎖,分布式情況下也能夠使用)。
使用select ... for update 語句
6.累計投標金額,即把當前的投標總額加上當前投標用戶的“金額”。
這里面存在一個“爭議”,假設標的總額2000,已經投了1800。用戶投了300,這個時候300>200。理論上不能成功。
假設不成功,用戶搶到標卻無法投。可能非常傷心;假設讓用戶投,有的用戶想“整投”。不想把錢“打散”。也可能非常傷心。
監理投標書的核心。
為了簡化處理。一種方式是,把用戶投標的錢算成200,即最大可投資金額。
7.更新投標狀態。
8.保存投標信息tender對象。
9.扣除用戶的賬戶錢,減去剛剛投資的金額。實際操作為把用戶賬戶的錢轉到平臺賬戶下。
存在一個問題,一次標。把全部用戶的錢,轉到平臺賬戶,會須要非常多次轉賬。
因此,設立一個比較特殊的“中間賬戶”,全部用戶的錢都轉到“中間賬戶”,等標滿了,一次性把中間賬戶的錢轉到平臺賬戶下。
10.返回投標信息。是否成功。投標金額等。
投標過程中的注意事項:
1.開啟事務。
2.數據庫行級鎖,鎖住投標狀態。
3.檢查用戶的可投資金額等前提條件檢查。
4.平臺設立中間賬戶,降低轉賬產生的流水記錄。