C# 如何解决销售数据库中的并发事务问题

C# 如何解决销售数据库中的并发事务问题,c#,sql,sql-server,C#,Sql,Sql Server,我的应用程序正在SQL表中存储一些称为事务的数据。用户可以从Client1向Client2销售一些东西,然后Client2就拥有了它。我以以下方式将其存储在表中: Client 1 | Buy | Something | Price | External | Client 1 | Sell | Something | Price2 | Client 2 | Client 2 | Buy | Something | Price2 | Client 1 | 第一个客户1买了它带来了它,或者只

我的应用程序正在SQL表中存储一些称为事务的数据。用户可以从Client1向Client2销售一些东西,然后Client2就拥有了它。我以以下方式将其存储在表中:

Client 1 | Buy  | Something | Price  | External |
Client 1 | Sell | Something | Price2 | Client 2 |
Client 2 | Buy  | Something | Price2 | Client 1 |
第一个客户1买了它带来了它,或者只是拥有了它。然后他把它卖给另一个客户

所有这一切都很好,它可以工作,但我的应用程序有一个很短的时间,当它不检查客户端1是否仍然拥有它声称拥有的数据加载到gui时。 所以,如果有两个用户为它跑步,那么Client1的产品可能会被销售多次。这很可能不会发生,因为我的用户倾向于分享他们正在做的工作,但总有

如何预防?在插入事务之前进行简单的select查询检查就足够了,还是应该以不同的方式进行?我可以想象这样的情况,当多人争先恐后,有些人会成功。在重型系统的实际情况下如何处理这一问题?比如,当你从一个银行账户上取钱时,你可以从两台不同的提款机上取两张卡,尽管我相信在这种情况下,他们只会让余额低于0,即使这是不允许的


那么我有什么选择呢?你对此有何看法?

我认为这不是一个真正的库存跟踪系统,数据库只记录真实世界的事件,而是一个虚拟拍卖或市场应用程序,其中“真实”是应用程序认为的任何东西

如果你只保留历史,你就永远不会有现在的状态。在没有当前状态的情况下,您无法做出有效的正确性决策。所以保持现状。拥有项目及其当前所有者的表格。然后,您提出的问题变成了一个简单的问题,即“如何防止更新丢失?”或“如何防止盲写”?在数据库应用程序中,冲突和答案是众所周知的:使用控件


有关如何在C和SQL中使用乐观并发的详细讨论,请参阅。

我计算运行总计,将它们存储在同一行中,并使用约束确保运行总计为非负。此处描述:

这不是一个关键的实时系统,而是一个必须使部门工作更轻松的系统。真正的数据存在于银行系统中,因此我们只需每天导入数据并对其进行一些操作,然后最终打印一份报告给我们的客户。如果数据来自银行系统,则您不必进行任何写入,也不会犯任何错误,对吗?如果你写了,那么不管数据是什么,从哪里来,或者它代表什么,我的评论都适用。我实际上不是在更新值,而是插入新行以保持所做工作的历史进度。所以我永远不会覆盖数据。我将有4行,2行卖出,2行买入,而不仅仅是2行。有些数据来自一个银行系统,有些来自市场,有些数据必须由我们的员工在全球证券交易所之外的私人股票发行中手动输入。这是可以在客户端之间出售的东西,数据库必须跟踪它,并且必须与帐户余额保持一致。@MadBoy:是的,添加一个具有当前状态的表,并保留事务记录。您也可以创建一些存储过程来帮助您管理这些内容。