Hacer debug a Locks en base de datos MySQL
Cuando trabajas con bases de datos relacionales una que otra vez te habrá tocado realizar una transacción para asegurar la integridad de los datos. Cuando tu aplicación tiene un número considerable de transacciones o has realizado alguna de manera incorrecta seguramente habrás visto un error del motor similar al siguiente:
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded
Este error indica que hay un bloqueo el cual puede darse por varias razones. Una de ellas, podría ser la no confirmación de una transacción, es decir, no se ha ejecutado commit()
o rollback()
. Para tratar de determinar las sentencias SQL en el entorno en el que te mueves, lo más sensato es buscar la lista de procesamiento de MySQL para tratar de observar qué sentencias están bloqueando a otras. Para esto basta utilizar el siguiente comando.
show full processlist\G
*************************** 1. row ***************************
Id: 4
User: event_scheduler
Host: localhost
db: NULL
Command: Daemon
Time: 260933
State: Waiting on empty queue
Info: NULL
*************************** 2. row ***************************
Id: 1116
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: starting
Info: show full processlist
*************************** 3. row ***************************
Id: 1125
User: erp_user
Host: localhost:55498
db: erp
Command: Execute
Time: 0
State: update
Info: insert into users values `users` values (1, `steave`, 1, now())
5 rows in set (0.00 sec)
Como puedes ver en el resultado anterior, puede existir conexiones en espera, conexiones iniciadas o conexiones ejecutando actualmente un proceso como es el caso de la número 3. Cuando se presenta un bloqueo en la base de datos generalmente te aparecerán dos o tres sentencias de las cuáles tu mismo puedes sacar las conclusiones acerca de cuál de ellas está realizando un bloqueo. Hasta la próxima.