我的应用程序将一些数据存储在名为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,即使不允许)。
那么我有什么选择?你对此有何看法?
答案 0 :(得分:3)
我认为这不是一个真正的库存跟踪系统,数据库只是记录现实世界的事件,而是一些虚拟拍卖或市场类应用,其中“现实”是应用程序所认为的。< / p>
如果您只保留历史记录,那么您将永远不会拥有当前状态。没有当前状态,您无法做出有效的正确性决策。所以保持现状。有一个项目表和他们当前的所有者。那么你问的问题就变成了“如何防止丢失更新?”的简单问题。或'我如何防止盲写'? (即write-write冲突),答案在数据库应用程序中众所周知:使用optimistic concurrency控件。
有关如何在C#和SQL中使用Optimistic Concurrency的详细讨论,请参阅Optimistic Concurrency (ADO.NET)。
答案 1 :(得分:0)
我计算运行总计,将它们存储在同一行,并使用约束来确保运行总计是非负数。这里描述: Denormalizing to enforce business rules: Running Totals