c# - 异常 : Deadlock

标签 c# sql deadlock database-deadlocks

当我尝试在 C# 中从 SQL 数据库中获取数据时,生成了这两个异常:

System.Data.SqlClient.SqlException: Transaction (Process ID 97) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.

System.Data.SqlClient.SqlException: Transaction (Process ID 62) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.

System.Data.SqlClient.SqlException: Transaction (Process ID 54) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

这是代码:

 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 Profiler 并告诉它给你一个 deadlock graph .运行此跟踪将告诉您与您的冲突的其他 查询。您的查询非常简单,但我严重怀疑您是否对系统中名为 MyTable 的表进行了 SELECT * 查询...

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

您可以做的其他事情:

  • 通过对查询应用正确的索引等方式加快查询速度。
  • 在数据库上启用快照隔离并在适当的事务中使用SET TRANSACTION ISOLATION LEVEL SNAPSHOT。同时启用 read committed with row-versioning .在许多情况下,这足以完全消除大多数死锁。阅读有关事务隔离级别的信息。 Understand你在做什么。

关于c# - 异常 : Deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4312563/

相关文章:

mysql - 在多个条件上关联 GROUP BY 和 LEFT JOIN 以显示最新记录?

sql - 在Play框架中ebean为sqlite数据库生成的错误SQL脚本

mysql - 共享锁升级为独占锁避免MySQL死锁

MySQL死锁与存储过程生成UID

c# - 在winforms中从数据库异步加载数据

c# - 在异步方法完成之前,UI 不会更新

php - 需要有关多个 WHERE 子句的帮助

c# - 将带有空格的 ListItem 添加到 ListBox

c# - 将文件移动到另一个文件夹时,FileInfo.Path 显示值不在预期范围内异常

ruby-on-rails - 是什么导致 Rails 应用程序中出现 'deadlock; recursive locking' 错误?