2011-04-28 26 views
9

Hay dos tablas:¿MySQL Query contiene subconsulta atómica?

Tabla 1 único Sesiones

ID Count 

Tabla 2 (Sesiones)

ID Name 

me gustaría actualizar count sólo si name no existe en sesiones para contar sesiones únicas, este es un ejemplo tan objetivo es no hacerlo de manera alternativa, sino que stion es:

Rowsaffected = Update table1 
        set Count = Count + 1 
       where (Select count(*) from table2 where Name = 'user1') = 0; 

Insert into table2 (NAME) values('user'); 

¿La primera consulta es una consulta atómica? Si es así, entonces no hay problema.

En caso negativo, ¿Qué ocurre si hay múltiples hilos ejecutándose para realizar las operaciones mencionadas anteriormente? Existe la posibilidad de que:

Subproceso 1: el recuento devuelve 0, se actualizó la tabla 1 pero no la tabla 2 antes de que se inicie el Tema 2. Subproceso 2: encuentra el recuento 0, también va a actualizar el recuento.

Ahora para el mismo usuario, la cuenta es 2, lo que no debería ocurrir.

Cualquier sugerencia/comentario.

Respuesta

1

Depende del motor de almacenamiento que esté utilizando.

Su ejemplo sólo funcionará correctamente con los motores de MySQL que soportan las transacciones, como InnoDB, ya que implementa correctamente el tratamiento de transacciones (y consistencia nivel comunicado leído)

MyISAM no admite transacciones.

+1

@Johan: ¿qué otro motor en MySQL admite transacciones? No conozco otros que InnoDB –

+0

P. ej. NDBCluster, BDB – Johan

+0

Estoy usando InnodDB, ¿quiere decir que la primera consulta es de naturaleza atómica, es decir, hasta que se complete la consulta, nadie más podrá leer esa tabla? – Navin