Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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# 当Update语句同时运行时,Select语句中的C SqlDataReader有时不返回任何行_C#_Sql Server_Locking_Collision_Sqldatareader - Fatal编程技术网

C# 当Update语句同时运行时,Select语句中的C SqlDataReader有时不返回任何行

C# 当Update语句同时运行时,Select语句中的C SqlDataReader有时不返回任何行,c#,sql-server,locking,collision,sqldatareader,C#,Sql Server,Locking,Collision,Sqldatareader,我有一个场景,在一段时间内运行多个SQL查询。在整个场景中,Update语句有可能与Select语句同时运行,从而影响同一个表。发生这种情况时,我的SqlDataReader对象运行Select查询,不返回任何行。但是,立即重试Select查询将导致收到正确的数据。Select语句实际上永远不会返回任何数据 虽然我可以在读取失败后重试查询以获得结果,但我希望首先避免这种冲突,或者至少有一种方法来区分实际没有读取行和发生这种冲突错误。在检查SqlDataReader对象时,告诉我读取失败的唯一不同

我有一个场景,在一段时间内运行多个SQL查询。在整个场景中,Update语句有可能与Select语句同时运行,从而影响同一个表。发生这种情况时,我的SqlDataReader对象运行Select查询,不返回任何行。但是,立即重试Select查询将导致收到正确的数据。Select语句实际上永远不会返回任何数据

虽然我可以在读取失败后重试查询以获得结果,但我希望首先避免这种冲突,或者至少有一种方法来区分实际没有读取行和发生这种冲突错误。在检查SqlDataReader对象时,告诉我读取失败的唯一不同属性是HasRows被设置为false,这对于我在这里寻找的内容来说不够具体。此外,尝试读取只会返回false,并且不会抛出一个可能说明读取失败原因的错误

到目前为止,我已经尝试在Select和Update查询上加锁,但我没有这样的运气。理想情况下,Update语句将具有一个锁,该锁将排队而不是阻止Select查询运行,直到事务完成。我尝试过几种不同的锁变体,但我尝试过的一个示例是:

update <Tablename> with (TABLOCKX, HOLDLOCK) set ...
这并没有像我预期的那样阻止碰撞,所以这就是我被卡住的地方

如果我知道永远不应该有空读取,那么在这里重试是最好的方法,还是像我建议的那样,有更好的方法使用SQL锁?

您可以看看互斥锁。您可以使用它来确保同时只允许一个实例/查询


如果要更新行,select语句应该等待释放锁。除非在更新和读取中使用查询提示,否则将改变此行为。目前,我仅有的锁定语句是更新语句中的语句。