¿Cómo puedo hacer cumplir las inserciones atómicas?

2

Estoy trabajando en una aplicación respaldada por una instancia de MySQL, y me he encontrado con un comportamiento extraño que involucra lo que parecen ser inserciones "fantasmas".

Dada una tabla con una clave de entero de incremento automático, realizo lo siguiente:

  1. INSERT ... // generates ID 1
  2. INSERT ... // generates ID 2
  3. INSERT ... // generates ID 3
  4. SELECT * // returns the set of elements 1 and 3

Parece que la segunda inserción genera una ID y vuelve al cliente antes de que finalice la inserción, por lo que puedo conocer la ID simultáneamente y no poder seleccionar los datos todavía. Esto es sorprendente: creo que la inserción no volvería hasta que se inserte la fila.

¿Hay alguna manera de decirle a MySQL que asigne un ID e inserte una fila en una operación atómica, de modo que, una vez que conozca el ID? 2, se garantiza que volverá de una consulta de selección?

earldouglas
fuente

Respuestas:

4

El truco que utilizo regularmente para aliviar este problema es crear una rutina almacenada que me asegure de que sea atómica utilizando lo siguiente:

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
     [your queries here]
COMMIT;

Supongo que puedes imitar este comportamiento programáticamente.

m4573r
fuente
Interesante, acabo de leer sobre LEER COMPROMETIDAS en los documentos; intentaré con estos.
earldouglas
El uso de SERIALIZABLE soluciona el problema, pero hace que las cosas sean demasiado lentas. También intenté LEER COMPROMETIDO, pero no sirvió de nada.
earldouglas
Si soluciona el problema, probablemente sea el camino a seguir. En su ejemplo, debe esperar de todos modos hasta que todas las inserciones se confirmen antes de hacer su selección, no hay manera de evitarlo. La pregunta entonces es por qué es lento ... ¿Son solo las consultas que necesita ejecutar atómicamente en la transacción? ¿Utilizan índices y están optimizados? ...
m4573r