Tengo una gran aplicación web de producción (Glassfish 3.1 + MySQL 5.5). Todas las tablas son InnoDB. Una vez por varios días, la aplicación se cuelga por completo. SHOW FULL PROCESSLIST
muestra muchas consultas de inserción o actualización simples en tablas diferentes, pero todos tengan la condición deMySQL InnoDB se bloquea esperando bloqueos a nivel de tabla
Esperando a nivel de tabla de bloqueo
Ejemplos:
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)
Las consultas con el 'tiempo' más largos son esperando el bloqueo del nivel de la mesa también. Por favor, ayuda a averiguar por qué MySQL intenta obtener el bloqueo de nivel y lo que puede bloquear todas estas tablas. Todos los artículos sobre el bloqueo de InnoDB dicen que este motor no usa bloqueo de tabla si no lo fuerza a hacerlo.
Mi my.cnf
tiene esto:
innodb_flush_log_at_trx_commit = 0
innodb_support_xa = 0
innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode=2
registro binario está apagado. No tengo "LOCK TABLES" u otros comandos de bloqueo explícitos. Las transacciones son READ_UNCOMMITED
.
SHOW ENGINE INNODB STATUS
de salida: http://avatar-studio.ru:8080/ph/imonout.txt
¿Por qué tiene el nivel de aislamiento en "READ_UNCOMMITED"., Es un modo sucio y nunca recomendaría configurarlo en servidores de producción. –
Puede haber información útil aquí: [Modos de bloqueo InnoDB] (http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html), especialmente las bloqueos de intención y las posibles causas de interbloqueos, como se describe más adelante en el documento. También tenga en cuenta los comentarios de los usuarios al final. – Mike