簡體   English   中英

如何解決銷售數據庫中的並發事務問題

[英]How to resolve concurrent transaction issues in sales database

我的應用程序是將一些數據存儲在名為Transactions的SQL表中。 用戶可以從Client1到Client2銷售一些東西,然后Client2就可以銷售。 我將它以下列方式存儲在表中:

Client 1 | Buy  | Something | Price  | External |
Client 1 | Sell | Something | Price2 | Client 2 |
Client 2 | Buy  | Something | Price2 | Client 1 |

第一個Client1買了它(把它帶進來或者只是讓它完全重要)。 然后他把它賣給另一個客戶。

一切都很好,它可以工作,但我的應用程序有一個很短的時間,它不檢查客戶端1是否仍然具有它聲稱擁有的內容(當數據加載到gui時)。 因此,如果有2個用戶可以運行它,那么Client1的產品可能會被多次出售。 最有可能它不會發生,因為我的用戶傾向於分享他們正在做的事情的工作,但總是但......

怎么預防這個? 在插入事務就足夠之前進行簡單的選擇查詢檢查還是應該以不同的方式完成? (我可以想象多個人為此奔跑而有些人會成功的情況)。 在重型系統的實際情況下如何處理? 就像當你從兩個不同的CashMachines的2張牌中從一個銀行賬戶中選擇錢時(雖然我相信他們只會讓平衡在這種情況下低於0,即使不允許)。

那么我有什么選擇? 你對此有什么看法?

我認為這不是一個真正的庫存跟蹤系統,數據庫只是記錄現實世界的事件,而是一些虛擬拍賣或市場類應用,其中“現實”是應用程序認為的任何東西。

如果你只記錄歷史,你將永遠不會擁有當前狀態。 沒有當前狀態,你無法做出有效的正確性決定。 所以保持現狀。 有一個項目表和他們當前的所有者。 那么你問的問題就變成了“如何防止丟失更新?”的簡單問題。 或'我如何防止盲寫'? (即寫 - 寫沖突),答案在數據庫應用程序中是眾所周知的:使用樂觀並發控制。

有關如何在C#和SQL中使用Optimistic Concurrency的詳細討論,請參閱樂觀並發(ADO.NET)

我計算運行總計,將它們存儲在同一行,並使用約束來確保運行總計是非負數。 這里描述: 非規范化以強制執行業務規則:運行總計

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM