我有这样的错误
锁定等待超时尝试重新启动事务
也许我不明白。但是如果我设置CommandTimeout = 1000或更高的值,我就有了解决方案。我还没有在生产中尝试过它。但我想听听有关此事的任何意见。
// 40 lines of command.Parameters here
command.Parameters.AddWithValue("sample1", sam1);
command.Parameters.AddWithValue("sample2", sam2);
command.Parameters.AddWithValue("sample3", sam2);
try
{
command.ExecuteNonQuery();
}
catch (MySqlException mex)
{
答案 0 :(得分:1)
您可以尝试(仅用于测试目的)设置事务隔离级别= " READ COMMITTED"如果失败,请尝试设置为" READ UNCOMMITTED" MySql reference 检查死锁:
" SHOW ENGINE INNODB状态"来自MySQL命令行客户端(不是 查询浏览器)将为您提供有关死锁的信息。
死锁也可能由未提交的事务引起(通常 程序错误)和运行未提交的人 交易不会看到问题,因为他们将正常工作 (通过他们的数据不会被提交)。 Quote from here
答案 1 :(得分:1)
我正在间歇性地接收“超过锁定等待超时尝试重启事务”。然后我开始在事务中包装所有东西,我停止接收这些错误。这应该可以防止在执行查询后保留表锁。
(假设“conn”是MySqlConnection,“iLevel”是您要使用的隔离级别,“query”包含您的查询字符串)
int rowCount = 0; // In case you want the number of rows affected
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
MySqlCommand command = new MySqlCommand(query, conn);
using(var transaction = conn.BeginTransaction(iLevel))
{
command.Transaction = transaction;
command.CommandTimeout = int.MaxValue;
// Set parameters etc...
try
{
rowCount = command.ExecuteNonQuery();
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
// Handle query exception...
}
}
}
catch(Exception ex)
{
// Handle general exception...
}