2010-09-02 10 views
0

Je ne suis pas vraiment sûr pourquoi l'application de console suivante ne produit pas le comportement attendu pour last_insert_id(). J'ai lu que last_insert_id() renvoie la dernière valeur auto_incremented pour une connexion particulière, mais dans ce code, le même résultat est retourné pour les deux connexions. Quelqu'un peut-il expliquer où je me suis trompé?Problème de simultanéité avec MySql Last_Insert_Id() ... (C#)

static void Main(string[] args) 
    { 
     string ConnectionString = "server=XXXX;database=XXXX;username=XXXX;password=XXXX;pooling=true;max pool size=100;min pool size=0"; 

     MySqlConnection conn1 = new MySqlConnection(ConnectionString); 
     MySqlConnection conn2 = new MySqlConnection(ConnectionString); 

     MySqlCommand command1 = new MySqlCommand(); 
     MySqlCommand command2 = new MySqlCommand(); 

     command1.Connection = conn1; 
     command2.Connection = conn1; 

     StringBuilder createTableCommandText = new StringBuilder(); 
     createTableCommandText.Append("Create Table TestTable ("); 
     createTableCommandText.Append("Id INT NOT NULL AUTO_INCREMENT, "); 
     createTableCommandText.Append("str VARCHAR(20) NOT NULL, "); 
     createTableCommandText.Append("PRIMARY KEY (Id));"); 

     StringBuilder insertCommandText = new StringBuilder(); 
     insertCommandText.Append("INSERT INTO TestTable (str) VALUES ('what is the dilleo?');"); 

     StringBuilder getLastInsertId = new StringBuilder(); 
     getLastInsertId.Append("SELECT LAST_INSERT_ID();"); 

     conn1.Open(); 
     conn2.Open(); 

     command1.CommandText = createTableCommandText.ToString(); 
     command1.ExecuteNonQuery(); 

     command1.CommandText = insertCommandText.ToString(); 
     command2.CommandText = insertCommandText.ToString(); 

     command1.ExecuteNonQuery(); 
     command2.ExecuteNonQuery(); 

     command1.CommandText = getLastInsertId.ToString(); 
     Console.WriteLine("Command 1: {0}", command1.ExecuteScalar().ToString()); 
     command2.CommandText = getLastInsertId.ToString(); 
     Console.WriteLine("Command 2: {0}", command2.ExecuteScalar().ToString()); 

     conn1.Close(); 
     conn2.Close(); 

     Console.ReadLine(); 
    } 

Je sais que cela ne se produit pas en raison de la mise en commun dans la chaîne de connexion en haut, depuis que j'ai essayé d'exécuter le programme sans cette partie de la chaîne, et je encore obtenu les mêmes résultats (à savoir que les deux commandes 1 et Command 2 affichent la même valeur pour last_insert_id()). Toutes les idées sont les bienvenues!

Un grand merci,

Andrew

+0

La validation automatique est-elle activée? Vous pourriez recevoir le même identifiant deux fois car aucune transaction n'a été validée. –

+0

Merci pour la réponse, Andrew. Je n'étais pas au courant, mais apparemment la validation automatique est activée par défaut. Guffa a trouvé mon erreur, mais je vais envisager de désactiver l'auto-commit à l'avenir. – Andrew

Répondre

2

Regardez ici:

command1.Connection = conn1; 
command2.Connection = conn1; 

Vous utilisez la même connexion pour les deux commandes.

+0

Ah mec, j'ai posé des questions ridicules, mais c'est probablement vers le haut de la liste. Merci pour l'aide, c'était vraiment le problème! – Andrew