我有一个大型的生产级Web应用程序(Glassfish 3.1 + MySQL 5.5)。 所有的表都是InnoDB引擎。但每隔几天应用程序就会完全挂起。
SHOW FULL PROCESSLIST
显示许多简单的插入或更新查询,涉及不同的表,但所有这些查询的状态都是:
等待表级锁定
例如:
update user<br>
set user.hasnewmessages = NAME_CONST('in_flag',_binary'\0' COLLATE 'binary')
where user.id = NAME_CONST('in_uid',66381)
insert into exchanges_itempacks
set packid = NAME_CONST('in_packId',332149), type = NAME_CONST('in_type',1), itemid = NAME_CONST('in_itemId',23710872)
具有最长“Time”的查询也在等待表级锁。请帮忙找出MySQL为什么尝试获取级别锁以及可能正在锁定所有这些表的内容。关于InnoDB锁定的所有文章都说,如果您不强制它这样做,则此引擎不使用表锁。
我的my.cnf
文件中有以下内容:
innodb_flush_log_at_trx_commit = 0
innodb_support_xa = 0
innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode=2
二进制日志已关闭。我完全没有"LOCK TABLES"或其他显式锁定命令。事务为READ_UNCOMMITED
。
SHOW ENGINE INNODB STATUS
输出:http://avatar-studio.ru:8080/ph/imonout.txt