Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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/5/sql/78.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# SqlException:死锁_C#_Sql_Deadlock_Database Deadlocks - Fatal编程技术网

C# SqlException:死锁

C# SqlException:死锁,c#,sql,deadlock,database-deadlocks,C#,Sql,Deadlock,Database Deadlocks,当我尝试从C中的SQL数据库获取数据时,生成了以下两个异常: System.Data.SqlClient.SqlException:事务进程ID 97在另一个进程的锁资源上被死锁,并被选为死锁受害者 或 System.Data.SqlClient.SqlException:事务进程ID 62在另一个进程的锁资源上被死锁,并被选为死锁牺牲品 或 System.Data.SqlClient.SqlException:事务进程ID 54在另一个进程的锁资源上被死锁,并被选为死锁受害者。重新运行事务 代

当我尝试从C中的SQL数据库获取数据时,生成了以下两个异常:

System.Data.SqlClient.SqlException:事务进程ID 97在另一个进程的锁资源上被死锁,并被选为死锁受害者

System.Data.SqlClient.SqlException:事务进程ID 62在另一个进程的锁资源上被死锁,并被选为死锁牺牲品

System.Data.SqlClient.SqlException:事务进程ID 54在另一个进程的锁资源上被死锁,并被选为死锁受害者。重新运行事务

代码如下:

 using (SqlConnection con = new SqlConnection(datasource))
 {
    SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con);
    cmd.CommandTimeout = 300;
    con.Open();
    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    con.Close();
    return ds.Tables[0];
 }
每次都是这样


关于如何解决这些问题,您有什么想法吗?

基本上,SQL server并发模型可以做到这一点,因此您永远无法避免此异常,例如,如果完全不相关的事务碰巧锁定了相同的索引页或其他内容,它们可能会相互阻塞。您所能做的最好的事情是缩短事务以减少发生的可能性,如果您遇到异常,请按照它所说的做,然后重试事务。

您可以做一些事情来减少收到的死锁数量,也可以做一些事情来完全消除它们

首先,启动SQL Server Profiler并告诉它为您提供一个。运行此跟踪将告诉您另一个与您的查询冲突的查询。您的查询非常简单,但我严重怀疑您的系统中是否有一个名为MyTable的表的SELECT*查询

无论如何,通过死锁图和其他查询,您应该能够知道哪些资源处于死锁状态。经典的解决方案是更改两个查询的顺序,以便以相同的顺序访问资源-这避免了循环

您可以做的其他事情:

通过对查询应用正确的索引,加快查询速度。 在数据库上启用快照隔离,并在适当的情况下在事务中使用设置事务隔离级别快照。还启用。在许多情况下,这足以完全消除大多数死锁。了解事务隔离级别。你在做什么。
这并不是说这有助于解决死锁问题,但您应该像处理SqlConnection那样处理其他IDisposable对象:

您可以通过查询中的锁定提示来避免锁定:

Select * from MyTable with (nolock) Where ID='1'

不过,我想澄清的是,您允许使用此解决方案读取未提交的数据。这在交易系统中是一种风险。希望这能有所帮助。

您是一次遇到此异常,还是每次尝试都会出现此异常?必须同时运行其他查询,这就是它死锁的原因。两个或多个查询希望访问相同的数据。我们需要查看所有正在运行的查询,而不仅仅是成为死锁受害者的查询。这样的查询不能导致死锁。它要求在1个表中的1行上有一个读锁。即使另一个进程拥有该锁,它也会愉快地等待,直到请求超时。要获得死锁,通常Process1具有锁a并正在等待锁B;当Process2有锁B并且正在等待锁A时,必须涉及一些其他查询。运行Sql Server探查器并监视正在数据库上执行的查询。更多探查器和死锁分析链接:1 2 3 Jeff Atwood前一段时间出现相同的异常:。他的文章可能会有所帮助:-您的应用程序混淆了阻塞和死锁的概念。这个例外是不可避免的,这一点都不是真的。不,我不是。如果使用默认的锁(有时是rowlock,有时是pagelock),很容易看到两个不相关的事务可能会意外地相互死锁,至少如果它们更新了事务中的两个表,并且您不使用提示来确保始终以相同的顺序读取表。对于rowlock的情况,这不太明显,但索引可能会在这里咬你一口。
Select * from MyTable with (nolock) Where ID='1'