2011-10-12 16 views
6

Por ejemplo, tengo una fila con una columna C1 value = 'clean', y dos clientes diferentes ejecutar esta consulta en el mismo tiempo:¿Las declaraciones únicas de mysql son atómicas en MyISAM e InnoDB?

update T1 set C1 = 'dirty' where Id = 1 

Sin el uso de transacciones, es garantizada independientemente del tipo de motor que la el valor de mysql_affected_rows() sería 1 para un cliente y 0 para el otro?

+1

Si necesita atomicidad, pero no desea utilizar tablas InnoDB, [consulte las tablas de bloqueo de MySQL] (http://dev.mysql.com/doc/refman/5.1/es/bloqueables-tablas).html) – bobobobo

Respuesta

11

Sí y No :-)

En ambos casos, el access is serialised (asumiendo que usted está utilizando un motor transaccional como InnoDB), ya que lleguen a la misma fila, de modo que no interfieran entre sí. En otras palabras, las declaraciones son atómica.

Sin embargo, el recuento de filas afectadas realmente depende de su conjunto de configuración cuando abre la conexión. El page for mysql_affected_rows() tiene esto que decir (mi negrita):

Para las instrucciones UPDATE, el valor de registros afectados por defecto es el número de filas en realidad cambió. Si especifica el indicador CLIENT_FOUND_ROWS a mysql_real_connect() cuando se conecta a mysqld, el valor de las filas afectadas es el número de filas "found"; es decir, emparejado por la cláusula WHERE.

Y a partir de the mysql_real_connect page:

CLIENT_FOUND_ROWS: Devuelve el número de filas encontró (coincidentes), no el número de cambió filas.

Por lo tanto, en términos de lo que sucede conCLIENT_FOUND_ROWS estando configurada, las filas afectadas para:

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

tienen nada que ver con si los datos se cambió, sólo lo filas emparejado. Esto sería 1 para ambas consultas.

Por otro lado, si se CLIENT_FOUND_ROWSno conjunto, la segunda consulta sería en realidad no estar cambiando la fila (puesto que ya está poblado de 'sucio') y tendría un número de filas de cero.

Si quería el comportamiento misma independientemente de que el ajuste (sólo muestran cambios), podría utilizar algo como:

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

¿Quiere decir que las actualizaciones de declaración única no son atómicas para MyIASM? – Pacerier

+0

Un rápido Google sugiere que MyISAM es en su mayoría atómico, siempre y cuando nunca se mate un hilo o una consulta. http://bugs.mysql.com/bug.php?id=51193 –

+0

@sanmai: de http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html: un bloqueo read, UPDATE o DELETE generalmente establecen bloqueos de registro en cada registro de índice que se escanea en el procesamiento de la instrucción SQL. – paxdiablo

3

MySQL es ÁCIDO conforme si se utiliza un motor de almacenamiento transaccional como InnoDB.

Cuestiones relacionadas