C# 虽然SQL表中有数据,但没有返回任何记录

C# 虽然SQL表中有数据,但没有返回任何记录,c#,sql,C#,Sql,这在PROD DB中发生过几次 下面的查询没有返回生产数据库中的记录,因此事务失败 SELECT Id, candoid, c3.clientname FROM client_data c1 (NOLOCK) JOIN client_data c3 (NOLOCK) ON c1.clientid = c3.TopclientID JOIN Main_program p (NOLOCK) ON c3.clientid

这在PROD DB中发生过几次

下面的查询没有返回生产数据库中的记录,因此事务失败

SELECT  Id, candoid, c3.clientname
        FROM    client_data c1 (NOLOCK)
        JOIN    client_data c3 (NOLOCK) ON c1.clientid  = c3.TopclientID
        JOIN    Main_program    p  (NOLOCK) ON c3.clientid  = p.clientid
        JOIN    sub_program     sp (NOLOCK) ON p.pgmid  = sp.pgmid
        WHERE                   c1.clientname   = 'HSBC'
        AND                 (sp.description = 'New HSBC' AND sp.Id =98752)
但这一记录一直存在,过去和现在都运作良好。 它不返回任何值,然后分配相应的错误代码,并将错误发回用C.Net编写的调用应用程序

我唯一的线索是,在这个流程中,客户机数据..客户机名称在到达上述查询之前被更新,这可能是问题所在?但我尝试在DEV中模拟,但没有成功


对此的任何提示/帮助都将不胜感激。

这可能是因为更新时出现了表锁。您是否有任何日志文件?您正在使用NOLOCK提示查询数据。脏读是不一致的读。此查询可以通过无数种方式不返回任何数据。数据既不存在也不存在。提交的数据确实存在,但您没有读取。@WynDiesel很遗憾,没有详细的日志,日志只包含从存储的过程中检索到的错误消息。表锁可能导致select语句不返回任何行?如何复制此内容?另请参见:。从本质上讲,把NOLOCK当作一种表示我不在乎结果是否正确的方式。这很少是你想要的,除非你不关心数据是否错误的监控场景,因为你很快就会重新阅读它,即使这样,也只有在你不打算根据可能不正确的数据做出决策的情况下。事实上,大多数时候你看不到问题,而它似乎解决了死锁,这让NOLOCK变得更加阴险。@RemusRusanu我同意提交还没有发生,但大多数时候它都在工作,这个问题很少发生,我无法重现。这可能是因为有一个表锁正在进行更新。您是否有任何日志文件?您正在使用NOLOCK提示查询数据。脏读是不一致的读。此查询可以通过无数种方式不返回任何数据。数据既不存在也不存在。提交的数据确实存在,但您没有读取。@WynDiesel很遗憾,没有详细的日志,日志只包含从存储的过程中检索到的错误消息。表锁可能导致select语句不返回任何行?如何复制此内容?另请参见:。从本质上讲,把NOLOCK当作一种表示我不在乎结果是否正确的方式。这很少是你想要的,除非你不关心数据是否错误的监控场景,因为你很快就会重新阅读它,即使这样,也只有在你不打算根据可能不正确的数据做出决策的情况下。事实上,大多数时候你看不到问题,而它似乎解决了死锁,这使得NOLOCK更加阴险。@RemusRusanu我同意提交还没有发生,但大多数时候它起作用,这个问题很少发生,我无法重现。