【发布时间】:2010-11-30 10:18:46
【问题描述】:
当我尝试从 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];
}
这些每次都会发生。
关于如何解决这些问题的任何想法?
【问题讨论】:
-
您是否遇到过这种异常,还是每次尝试都会出现这种情况?
-
必须有其他查询同时运行,这就是它死锁的原因。两个或多个查询想要访问相同的数据。我们需要查看所有正在运行的查询,而不仅仅是成为死锁受害者的查询。
-
你不能从这样的查询中获得死锁。它需要对 1 个表中的 1 行进行读锁定。即使另一个进程拥有该锁,它也会愉快地等待直到请求超时。要获得死锁,通常 Process1 拥有锁 A 并正在等待锁 B;而 Process2 有锁 B 并且正在等待锁 A。必须涉及一些其他查询。运行 Sql Server Profiler (msdn.microsoft.com/en-us/library/ms187929.aspx) 并监视数据库上正在执行的查询。
-
杰夫阿特伍德不久前也有同样的例外:Coding Horror: Deadlocked!。他的文章可能会有所帮助:-)
标签: c# sql deadlock database-deadlocks