【问题标题】:Setting CommandTimeout to solve lock wait timeout exceeded try restarting transaction设置CommandTimeout解决锁等待超时超时尝试重启事务
【发布时间】:2016-05-27 21:04:11
【问题描述】:

我有这样的错误

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

也许我没听懂。但如果我设置 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)
{

【问题讨论】:

  • lock 表示行/列/表被锁定 - 这可能是由另一个插入/更新语句引起的
  • @fubo,我该如何解决这个问题?
  • 如果每次都出现这个错误,你应该搜索“死锁”——但是不知道语句是不可能回答这个问题的
  • 我也有这个问题...但是增加我的 CommandTimeout 并没有解决问题。 CommandTimeout 不同于锁定等待超时。 my.ini 中的“innodb_lock_wait_timeout”设置控制超时时间,默认值为 50 秒。来自:dev.mysql.com/doc/refman/5.7/en/…

标签: c# mysql


【解决方案1】:

您可以尝试(仅出于测试目的)设置事务隔离级别 = “READ COMMITTED”,如果失败,请尝试设置为“READ UNCOMMITTED” MySql reference 检查死锁:

来自 MySQL 命令行客户端的“SHOW ENGINE INNODB STATUS”(不是 查询浏览器)将为您提供有关死锁的信息。

死锁也可能由未提交的事务引起(通常 程序错误)和运行未提交的人 交易不会看到问题,因为它们会正常工作 (通过他们的数据不会被提交)。 Quote from here

【讨论】:

    【解决方案2】:

    我间歇性地收到“超过锁定等待超时尝试重新启动事务”。然后我开始将所有内容都包装在事务中,并且不再收到这些错误。这应该可以防止在执行查询后保留表锁。

    (假设“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...
    }
    

    【讨论】:

    • 另外我应该提到我将“iLevel”传递给 BeginTransaction 函数。这是一个保存您要使用的隔离级别的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2019-06-02
    • 1970-01-01
    • 2013-09-22
    • 2015-09-27
    • 2021-01-12
    • 2019-03-11
    相关资源
    最近更新 更多