sql >> Base de Datos >  >> RDS >> Mysql

¿Las declaraciones mysql individuales son atómicas en MyISAM e InnoDB?

Sí y No :-)

En ambos casos, el acceso es serializado (suponiendo que esté utilizando un motor transaccional como InnoDB) ya que llegan a la misma fila, por lo que no interferirán entre sí. En otras palabras, las declaraciones son atómico.

Sin embargo, el recuento de filas afectadas en realidad depende de su configuración establecida cuando abre la conexión. La página para mysql_affected_rows() tiene esto que decir (mi negrita):

Y desde la página mysql_real_connect :

Entonces, en términos de lo que sucede con CLIENT_FOUND_ROWS siendo configurado, las filas afectadas para:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1

no tener nada que ver con si los datos se cambian, solo qué filas coinciden. Esto sería 1 para ambas consultas.

Por otro lado, si CLIENT_FOUND_ROWS era no establecido, la segunda consulta en realidad no cambiaría la fila (ya que ya está poblada con 'sucio') y tendría un recuento de filas de cero.

Si quisieras lo igual comportamiento independientemente de esa configuración (solo mostrando cambios), podría usar algo como:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'