Voy a tener que actualizar un programa para permitir puntos muertos. ¿Es posible que esa SELECT
declaración produzca errores de punto muerto? Sé que es sólo un bloqueo de lectura por lo que múltiples selecciona no será un problema, pero lo que si hay una INSERT
, UPDATE
o DELETE
declaración (con subconsultas posible con uniones) y una SELECT
declaración (es posible con une o subconsultas) ?
¿Es posible que el error se arroje en SELECT
lugar de INSERT
, UPDATE
o DELETE
?
Respuestas:
La respuesta directa al título de su pregunta es No.
Las consultas SELECT pueden realizar bloqueos en el gen_clust_index , también conocido como el índice agrupado .
Aquí hay tres preguntas de Intercambios de pila de DBA que miré agresivamente con @RedBlueThing , la persona que hizo estas preguntas. @RedBlueThing encontró soluciones para sus preguntas.
Solo para mantener su pregunta en perspectiva, cuando revise estas respuestas (no mire demasiado profundamente, incluso me mareo al mirar mis propias respuestas enrevesadas) debería ser rápidamente evidente que las consultas SELECT pueden bloquear datos.
También tiene casos especiales de SELECT donde puede bloquear filas específicas bajo demanda .
ACTUALIZACIÓN 2011-08-08 16:49 EDT
Hiciste la pregunta de variación: "¿SELECT puede lanzar excepciones de punto muerto de InnoDB? La respuesta a eso puede ser Sí bajo una determinada condición. ¿Cuál es esa condición? Si solo una declaración SQL se revierte como resultado de un error, algunos de los bloqueos establecidos por la declaración pueden conservarse. Esto sucede porque InnoDB almacena bloqueos de fila en un formato tal que no puede saber después qué bloqueo se estableció con qué instrucción .
En base a esa afirmación, las secuencias de eventos para causar esto podrían ser teóricamente las siguientes:
Personalmente, esa última declaración me asusta. Hubiera sido bueno para MySQL informar a todos de esta peculiaridad. Sin embargo, esa declaración es de la documentación de MySQL. (Oh sí, Oracle posee InnoDB)
ACTUALIZACIÓN 2015-09-22 18:40 EST
A principios de año, aprendí que Percona tiene un cheque de Nagios genial para encontrar estas molestas cerraduras escondidas detrás de las conexiones para dormir. Todo lo que tiene que hacer ahora es ejecutar el código desde ese enlace:
Esto solo funcionará para MySQL 5.5+. Si tiene MySQL 5.1 o anterior, debe eliminar todas las conexiones inactivas para liberar los bloqueos.
fuente
for update
por supuesto)?select
pueda bloquear filas o de alguna manera ser bloqueada por DML en otra transacción. ¿Eso es cierto para Oracle y, por lo que puedo decir, también es cierto para InnoDB? Excepto el caso cuando laselect
declaración realmente hace DML a través de una función o alguna otra ruta circular, por supuesto.