C# .Net/SQL Server竞争条件

C# .Net/SQL Server竞争条件,c#,sql-server,database,race-condition,C#,Sql Server,Database,Race Condition,我有一个集成测试,如下所示: [TestMethod] public async Task TestMethod1() { Guid guid = Guid.NewGuid(); using (HttpClient client = new HttpClient()) await client.GetAsync(String.Format(_uri, guid.ToString())); Guid ret

我有一个集成测试,如下所示:

[TestMethod]
    public async Task TestMethod1()
    {
        Guid guid = Guid.NewGuid();

        using (HttpClient client = new HttpClient())
            await client.GetAsync(String.Format(_uri, guid.ToString()));

        Guid retrieved = GetLastGuid();
        Assert.AreEqual(guid, retrieved);
    }
client.GetAsync
正在调用一个简单的web服务,该服务将Guid保存在数据库表中
GetLastGuid
对表执行以下查询:

从dbo.Messages order by MessageId desc中选择top 1*

其中,message id是messages表上的标识列

把尝试测试数据库交互的智慧放在一边,我看到了以下行为,并且从纯技术的角度来看,我很想知道发生了什么

我预期会发生什么

调用该服务,并将Guid保存到数据库中。查找数据库表中最近的行将返回最后一个条目。我的理解(我怀疑我是不正确的)是,在SQL server上执行存储过程是一个同步过程,即在提交事务之前它不会返回

实际发生的事情

将几个调用链接到我的测试方法会导致其中一些失败。看起来他们正在检索上一次调用的Guid

我认为可能的原因是什么

我怀疑我关于存储过程调用是同步的假设是有缺陷的,我失败的测试实际上是在提交前一个事务之前读取最新的值。唯一让我怀疑的是,将
GetLastGuid
查询设置为readuncommitted仍然会导致相同的问题


所有测试方法都是按顺序运行的,没有其他方法写入此数据库表。明智地使用线程。在调试模式下睡眠/运行可以解决这个问题,所有竞争条件的典型标志。

选择top 1并不保证为您提供正确的guid。您应该指定从dbo.Messages中选择*,其中guid=@guid,或者让messageid(?)从http客户端调用返回,并使用它来获取数据和比较guid。虽然如果没有返回数据,则应首先检查断言。

如果不使用
using
作用域,会发生什么情况?如果代码中的guid是on SQL,请注意这些ID不是顺序的,因此无法按guid排序以获取最新的ID。