2011-09-07 13 views
9

Realizo 2 consultas en una transacción: SELECCIONAR (que contiene la cláusula JOIN) y ACTUALIZAR. Se requiere que los datos en las filas seleccionadas no cambien antes de que se realice la actualización, entonces estoy usando la cláusula FOR UPDATE. Mi pregunta es: ¿el 'para actualizar' funciona solo para una parte de los datos seleccionados de la tabla especificada en la cláusula FROM o para los datos de las tablas unidas también? Mi DBMS es MySql.¿Funciona el bloqueo de filas 'para actualizar' también para tablas unidas?

Respuesta

6

El documentation simplemente dice que el bloqueo está en las filas leídas sin excepción, por lo que debe estar en todos los registros en todas las tablas unidas. Si desea bloquear solo las filas en una de las tablas, puede hacerlo por separado: 'SELECCIONAR 1 FROM tabla de claves DONDE ... PARA ACTUALIZAR'.

Dicho esto, esto no es necesario simplemente para evitar una actualización entre SELECT y UPDATE. El bloqueo de lectura en SELECT ya hace esto. El propósito de FOR UPDATE sería evitar que otra transacción lea las filas y, por lo tanto, causar un punto muerto porque la ACTUALIZACIÓN no se puede aplicar hasta que la otra transacción libere su bloqueo de lectura.

+2

"Dicho esto, esto no es necesario simplemente para evitar una actualización entre SELECT y UPDATE. El bloqueo de lectura en SELECT ya lo hace" No creo que sea cierto. Eso solo es cierto si lo haces SELECCIONAR ... BLOQUEO EN MODO COMPARTIR –

Cuestiones relacionadas