php mysql,查询被锁定,永远不会返回

时间:2011-11-17 06:32:44

标签: php mysql

locked and never released

我的系统创建了大量的交易,因为它有很多用户和大量的数据,每天检查并更新。

不知何故在某个时刻(我不确定它是否是执行它的备份)在查询上有一个LOCKED。不知何故,他们永远不会回来。这是僵局吗? 数据库也没有向代码返回任何内容,所以我无法检查它是否被锁定。此外,这会导致其他查询停止并堆积,我的服务器用完了连接......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

可能是由几个问题引起的。最受欢迎的是MyISAM桌锁。试试这个问题:SHOW STATUS LIKE 'Table%';。发布在这里。如果Table_locks_waited很大(例如超过Table_locks_immediate的0.5%)并且您正在使用MyISAM切换到InnoDB表引擎。

如果您的数据库不是很大,那么更改引擎的速度非常快且透明。

请注意,所有锁定的查询都是"写"查询。那是因为MyISAM长时间运行会选择锁定表。而且,选择会导致某种死锁。来自docs的报价:

  

MySQL如下所示授予表写锁:

     
      
  1. 如果桌面上没有锁,请在其上放置一个写锁定。
  2.   
  3. 否则,将锁定请求放入写锁定队列。
  4.         

    MySQL如下所示授予表读锁:

         
        
    1. 如果表上没有写锁定,请对其进行读锁定。
    2.   
    3. 否则,将锁定请求放入读锁定队列。
    4.   

不要忘记调整innodb_ * params!

如果您不想切换到InnoDB(为什么?!),您可以在my.cnf中调整concurrent_insert parameter(尝试" 2")。

不过,我看到很多睡眠连接。你有持久的联系吗?如果"是",你是否正确关闭它们?