【发布时间】:2014-10-13 11:15:39
【问题描述】:
我有一个 MySQL 连接,它在一个单独的线程中执行一个查询,由一个 Task 表示。
通过取消令牌,当用户单击按钮时,我将停止此线程。
我的问题是出现以下错误:Lock wait timeout exceeded; try restarting transaction
这是我的代码:
cancellationToken = new CancellationTokenSource();
await Task.Run(() =>
{
using (MySqlConnection connection = new MySqlConnection(sourceDatabaseConnectionString))
{
connection.Open();
using (MySqlCommand command = new MySqlCommand(sql, connection))
{
command.CommandTimeout = 0;
command.Parameters.AddWithValue("@month", datePicker.Value.Month);
command.Parameters.AddWithValue("@year", datePicker.Value.Year);
int rows = command.ExecuteNonQuery();
}
}
}
}, cancellationToken.Token);
按下按钮时,我正在呼叫cancellationToken.Cancel();
当我尝试通过启动任务再次执行 SQL 语句时,我收到如上所示的错误消息。可能是什么原因造成的?
【问题讨论】:
-
我打赌最有趣的部分是在“//执行查询”评论下
-
@vtortola - 这个问题似乎并没有解释如何解决它,除了手动杀死 MySQL 中的进程。取消线程/任务时,查询也应该取消,不是吗?
-
我认为问题可能出在您在此处使用的 SQL 和其他查询中,与您的 C# 代码没有直接关系。可能当您调用“取消”时,该代码中会引发异常,您应该捕获以“回滚”事务,否则当您再次尝试运行时锁定仍然存在。
-
为什么任务会被取消?没有什么可以实际观察到取消。你不想
ExecuteNonQueryAsync(cancellationToken.Token)吗?你只是假设它被取消了吗?我怀疑 TPL 会Thread.Abort和Task取消它。
标签: c# mysql sql .net multithreading