设置CommandTimeout以解决锁定等待超时超过尝试重新启动事务

时间:2016-02-16 14:22:36

标签: c# mysql

我有这样的错误

  

锁定等待超时尝试重新启动事务

也许我不明白。但是如果我设置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)
{

2 个答案:

答案 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...
}