Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WebAPI2/EntityFramework项目中管理对同一数据库行的同步更新?_C#_Sql Server_Entity Framework 6_Asp.net Web Api2 - Fatal编程技术网

C# 如何在WebAPI2/EntityFramework项目中管理对同一数据库行的同步更新?

C# 如何在WebAPI2/EntityFramework项目中管理对同一数据库行的同步更新?,c#,sql-server,entity-framework-6,asp.net-web-api2,C#,Sql Server,Entity Framework 6,Asp.net Web Api2,我使用C#和.NET Framework 4.5.2设计了一个Web API 我的解决方案中的一个业务对象拥有一个平衡,该对象直接映射到数据库中的一个表。我在数据模型项目中使用EntityFramework6来访问数据库 每次更新余额时,都需要创建关联的事务(映射到另一个数据库表的单独业务对象),但前提是余额更新成功 鉴于上述情况,我目前正在使用“TransactionScope”在SQL事务中包装余额的更新和关联事务的创建 我的问题是, 我如何保持平衡的完整性并防止 当有多个客户机同时运行时

我使用C#和.NET Framework 4.5.2设计了一个Web API

我的解决方案中的一个业务对象拥有一个平衡,该对象直接映射到数据库中的一个表。我在数据模型项目中使用EntityFramework6来访问数据库

每次更新余额时,都需要创建关联的事务(映射到另一个数据库表的单独业务对象),但前提是余额更新成功

鉴于上述情况,我目前正在使用“TransactionScope”在SQL事务中包装余额的更新和关联事务的创建

我的问题是,

  • 我如何保持平衡的完整性并防止 当有多个客户机同时运行时,余额不会降至零以下 访问我的API
如果我通过从数据库获取行并在C#代码中检查余额,在更新余额之前检查余额不会降到零以下,那么在我检查之后,另一个客户端仍有可能减少余额。我相信Web API客户端调用是异步的

我认为我需要以某种方式锁定我正在更新的数据库行,直到事务完成,即从我的初始余额检查开始,直到余额被更新并且关联的事务已成功过帐

如果我在“TransactionScope”中做的第一件事与下面的SQL类似,那么如果我为事务设置了适当的隔离级别,“Accounts”表是否会一直锁定到事务结束

IF (SELECT Balance FROM Accounts WHERE ID = 1) >= 40
    UPDATE Accounts SET Balance = Balance - 40 WHERE ID = 1
如果上面if语句检查中的第一行运行,而另一个事务恰好在if检查之后减少了余额,会发生什么情况?然后运行上面SQL中的第二行并将余额减少到零下?这是可能的,还是SQL Server确保在if语句块完成之前,像上面这样的if检查始终有效?或者这也取决于SQL事务隔离级别?这一部分是需要理解的关键概念

因为我使用的是实体框架,所以如果可能的话,我也希望避免像上面那样运行手动SQL语句。单独使用实体框架/LINQ可以实现同样的功能吗


还有一点需要注意的是,如果客户端调用会将余额降至零以下,我计划返回一个适当的HTTP响应代码,客户端可以据此执行操作。我的业务对象的性质意味着一次只能有一个人更新余额,但仍有可能“同时”更新同一行,因此我需要考虑这种可能性。

如果我在“TransactionScope”中做的第一件事与下面的SQL类似,如果我为事务设置了适当的隔离级别,“Accounts”表是否会一直锁定到事务结束?
是的,这就是隔离级别的全部要点。在您的情况下,您需要
可重复读取
。非常感谢。我发现这个链接非常有用。您知道是否有一种方法可以直接使用Entity Framework对正在更新的行进行锁定,同时仍将if检查作为SQL查询的一部分运行。我相信我可以通过实体框架实现自定义SQL查询,但我只是想知道这是否是我唯一的选择。希望这是有意义的。您可能希望阅读列类型:rowversion-您可以阅读它,但不能设置它,并且它会在您的行发生更改时更改。如果您将其与PK结合使用,您将确保您的行在读和写之间不会发生更改。