我的系统创建了大量的交易,因为它有很多用户和大量的数据,每天检查并更新。
不知何故在某个时刻(我不确定它是否是执行它的备份)在查询上有一个LOCKED。不知何故,他们永远不会回来。这是僵局吗? 数据库也没有向代码返回任何内容,所以我无法检查它是否被锁定。此外,这会导致其他查询停止并堆积,我的服务器用完了连接......
有什么想法吗?
答案 0 :(得分:0)
可能是由几个问题引起的。最受欢迎的是MyISAM桌锁。试试这个问题:SHOW STATUS LIKE 'Table%';
。发布在这里。如果Table_locks_waited
很大(例如超过Table_locks_immediate
的0.5%)并且您正在使用MyISAM切换到InnoDB表引擎。
如果您的数据库不是很大,那么更改引擎的速度非常快且透明。
请注意,所有锁定的查询都是"写"查询。那是因为MyISAM长时间运行会选择锁定表。而且,选择会导致某种死锁。来自docs的报价:
MySQL如下所示授予表写锁:
- 如果桌面上没有锁,请在其上放置一个写锁定。
- 否则,将锁定请求放入写锁定队列。
醇>MySQL如下所示授予表读锁:
- 如果表上没有写锁定,请对其进行读锁定。
- 否则,将锁定请求放入读锁定队列。
醇>
不要忘记调整innodb_ * params!
如果您不想切换到InnoDB(为什么?!),您可以在my.cnf中调整concurrent_insert parameter(尝试" 2")。
不过,我看到很多睡眠连接。你有持久的联系吗?如果"是",你是否正确关闭它们?