Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 螺纹安全“;选择";Linq查询?_C#_Linq_Concurrency - Fatal编程技术网

C# 螺纹安全“;选择";Linq查询?

C# 螺纹安全“;选择";Linq查询?,c#,linq,concurrency,C#,Linq,Concurrency,我理解编辑行如何导致并发问题,但选择行导致的并发问题是我不理解的 如果查询从数据库中选择数据,如何出现并发问题?如果我选择的数据发生了变化,事情会爆炸吗 在任何情况下,如果select查询导致并发性问题,那么最好的处理方法是什么?这是我的想法,但如果它是错的,我一点也不会感到惊讶 try { var SelectQuery = from a DB.Table where a.Value == 1 select new {Result = a}; } catch

我理解编辑行如何导致并发问题,但选择行导致的并发问题是我不理解的

如果查询从数据库中选择数据,如何出现并发问题?如果我选择的数据发生了变化,事情会爆炸吗

在任何情况下,如果select查询导致并发性问题,那么最好的处理方法是什么?这是我的想法,但如果它是错的,我一点也不会感到惊讶

try
{
    var SelectQuery = 
    from a DB.Table
    where a.Value == 1
    select new {Result = a};
}
catch 
{
    //retry query??
}

在这种情况下,select操作实质上相当于一个读取/查询。即使是只读操作也会导致应用程序中出现并发问题

最简单的例子是,从中读取的对象具有线程关联,并且从不同的线程读取。这可能会导致竞争,因为数据的访问方式不正确

处理并发性问题的最佳方法就是简单地避免它。如果有两个线程处理相同的数据,那么使用锁序列化对数据的访问可能是最好的方法。虽然最终的解决方案需要更多的细节


你能解释一下这里发生了什么以及为什么会发生这场比赛吗?在您读取该对象时,是否有其他线程修改该对象?

当您的查询运行时,将生成一个与您的查询相对应的SQL查询。如果其他线程(或任何其他线程)试图修改查询中涉及的表,数据库服务器通常会检测到这一点,并注意必要的逻辑,以防止这一点导致任何实际问题。如果查询不断与update语句发生冲突,则执行查询可能需要更长的时间,但唯一真正的问题是系统检测到某些正在运行的事务组合实际上导致了死锁。在这种情况下,它将终止其中一个连接。我相信只有当您的语句试图更新数据库值时才会发生这种情况——而不是从selects更新

看看您的示例,更重要的一点是,您放在try/catch块中的代码实际上不执行任何查询。它只是构建了一个表达式树。在执行导致计算此表达式树的操作之前,SQL查询实际上不会运行,例如调用
SelectQuery.ToList()

请记住,当您试图查询数据库时,有许多事情可能会“出错”。可能有人正在对您试图选择的数据进行大量更新,而您的连接在完成查询之前超时。也许是电缆被撞坏了,或者是一点随机的宇宙辐射导致了某个地方的一点丢失。同样,可能您的查询有问题,或者您正在使用的数据库上下文没有与数据库模式同步。有些可能出错的事情只是断断续续的,你可以像你的问题所暗示的那样再试一次。其他事情可能会持续更长时间,并且会不断重复。对于后一种情况,如果您尝试重复您的操作,直到停止出错,那么您的线程可能会在那里挂起很长时间

因此,在决定如何处理数据库连接问题时,请注意每种类型的问题发生的频率。我见过这样的代码,在放弃之前尝试运行事务三次。但是当涉及到日常查询时,这种情况很少发生,我个人会允许异常慢慢出现,用户界面会说“出现意外错误。请重试。如果问题仍然存在,请与管理员联系。”或者类似的话