Como posso impor inserções atômicas?

2

Estou trabalhando em um aplicativo apoiado por uma instância do MySQL, e encontrei um comportamento estranho envolvendo o que parece ser inserções "fantasmas".

Dada uma tabela com uma chave inteira de incremento automático, eu faço o seguinte:

  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 a segunda inserção gera um ID e retorna ao cliente antes que a inserção seja concluída, para que eu possa saber simultaneamente o ID e não conseguir selecionar os dados ainda. Isso é surpreendente - eu pensaria que a inserção não retornaria até que a linha fosse inserida.

Existe uma maneira de dizer ao MySQL que aloque um ID e insira uma linha em uma operação atômica, de modo que, uma vez que eu saiba da ID 2 , é garantido que ela retornará de uma consulta de seleção?

    
por earldouglas 17.12.2013 / 22:40

1 resposta

4

O truque que eu uso regularmente para aliviar esse problema é criar uma rotina armazenada que garanto que é atômica usando o seguinte:

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

Eu acho que você pode imitar esse comportamento programaticamente.

    
por 17.12.2013 / 22:57

Tags