当我尝试在 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/