2011-07-12 30 views
9

¿"SELECT ... FOR UPDATE" se unen las filas unidas en MySQL?MySQL InnoDB bloquea en las filas unidas

Si es así, ¿es posible deshabilitar este comportamiento?

No hay nada de esto en la documentación. He visto que Oracle admite "SELECT ... FOR UPDATE OF table_name", donde table_name es la tabla principal o una de las tablas combinadas para las cuales se bloquearán las filas afectadas, pero nunca he visto esto mencionado en contexto con MySQL.

+0

¿La instrucción de actualización bloquea las filas en las otras tablas? Creo que debería (tal vez depende del nivel de aislamiento), ya que los valores en la actualización pueden depender de los valores en la otra tabla. ¿Necesita usar para la actualización? ¿Tal vez el bloqueo en modo compartir es lo que estás buscando? De todos modos, personalmente estoy interesado en esta respuesta, pero tal vez la única forma de saberlo es probar esto. –

+0

Investigué un poco con la información mejorada proporcionada por el complemento InnoDB y por el número de filas que bloquean mis transacciones y el comportamiento de mi aplicación. Diría que MySQL está bloqueando todas las filas unidas además de las filas de la tabla principal . No he podido encontrar una cláusula de consulta o una opción InnoDB que cambiaría esto, por lo que parece que estamos estancados con este comportamiento predeterminado por ahora. –

+0

Encontré la respuesta en la documentación de MySQL – RolandoMySQLDBA

Respuesta

0

SELECCIONAR ... PARA LA ACTUALIZACIÓN bloquea las filas y las entradas de índice asociadas, al igual que si emitió una instrucción UPDATE para esas filas.

y luego

Si se habilita la confirmación automática, las filas que coincidan con la especificación no están bloqueadas.

¿Esto no responde mySQL doc?

+1

No, JOIN no se menciona en el documento. –

4

Ver this MySQL doc page. Dice:

Una lectura de bloqueo, una ACTUALIZACIÓN o un BORRADO generalmente establecen bloqueos de registro en cada registro de índice que se escanea en el procesamiento de la instrucción SQL. No importa si hay condiciones WHERE en la declaración que excluirían la fila.

y:

Por SELECT ... FOR UPDATE o SELECT ... LOCK IN SHARE MODE, se adquieren bloqueos de filas examinadas, y espera que sea lanzado para las filas que no pueden clasificarse inclusión en el conjunto de resultados (por ejemplo, si no cumplen los criterios dados en la cláusula WHERE). Sin embargo, en algunos casos, las filas podrían no desbloquearse inmediatamente porque la relación entre una fila de resultados y su fuente original se pierde durante la ejecución de la consulta.

"filas escaneadas" hace referencia a las filas de cualquiera de las tablas que se utilizan en la unión.

Cuestiones relacionadas