C# SqlException-带锁的死锁
获取以下代码中的错误: SqlException:事务进程ID 80在另一个进程的锁资源上被死锁,并被选为死锁受害者。重新运行事务 其他代码:C# SqlException-带锁的死锁,c#,sql-server,sql-server-2008-r2,C#,Sql Server,Sql Server 2008 R2,获取以下代码中的错误: SqlException:事务进程ID 80在另一个进程的锁资源上被死锁,并被选为死锁受害者。重新运行事务 其他代码: public static void Start() => new Action[] { CleanAbc }.ToList().ForEach(clean => new Thread(() => { while (true) { t
public static void Start() => new Action[]
{
CleanAbc
}.ToList().ForEach(clean => new Thread(() =>
{
while (true)
{
try
{
Thread.Sleep(TimeSpan.FromMinutes(1));
if (IsClean())
{
clean();
}
}
catch (Exception ex)
{
}
}
}).Start());
private static bool IsClean() =>
TimeSpan.FromHours(5) < DateTime.Now.TimeOfDay
|| DateTime.Now.TimeOfDay < TimeSpan.FromHours(19);
有关于如何改进的建议吗?这是一个队列吗?我认为问题不在于代码,而在于SQL。要么您编写的查询速度非常慢,并被选为死锁受害者,要么您在服务器上运行其他速度较慢的查询;此查询被选为死锁牺牲品。我认为您需要考虑提高查询的性能,而这可能不是您这里的查询。要选择重删除查询作为死锁受害者,必须同时运行资源更密集的查询。最有可能的候选者实际上就是您正在运行的同一个查询。验证在查询与自身并行运行的情况下,或者在以前运行的实例从未取消的情况下,没有造成某种并发性问题。如果必须,请使用探查器确定正在运行的查询。
public static void Start() => new Action[]
{
CleanAbc
}.ToList().ForEach(clean => new Thread(() =>
{
while (true)
{
try
{
Thread.Sleep(TimeSpan.FromMinutes(1));
if (IsClean())
{
clean();
}
}
catch (Exception ex)
{
}
}
}).Start());
private static bool IsClean() =>
TimeSpan.FromHours(5) < DateTime.Now.TimeOfDay
|| DateTime.Now.TimeOfDay < TimeSpan.FromHours(19);