2009-09-15 4 views
1

J'utilise mysql avec asp.net sur mon serveur web. J'utilise également une base de données sqlite pour pouvoir utiliser la base de données sur un autre périphérique. Je dois envoyer des données entre les deux bases de données. C'est quelque chose qui doit être fait plusieurs fois par jour. Ceci est un exemple de la façon dont je le fais:erreur mysql: Lock attente timeout dépassé

using (MySqlTransaction mysqltransaction = mysqlconn.BeginTransaction()) 
      { 
       using (mysqlcmd) 
       { 
        //Creates parameters 
        MySqlParameter parmitemid = new MySqlParameter("?itemid", MySqlDbType.Int32); 
        mysqlcmd.Parameters.Add(parmitemid); 
    //Creates more parameters, can't show them all... 

        //For each row in the sqlite table, do the insert 
        while (reader.Read()) 
        { 
         //Sets the parameters, can't show them all 
         parmitemid.Value = reader.GetInt(1); 
    mysqlcmd.CommandText = "INSERT INTO tblitem (itemid,......,customerid) VALUES (?itemid,......,(SELECT customerid FROM tblcustomer WHERE fid=?fid ORDER BY customerid DESC LIMIT 1))"; 
         mysqlcmd.ExecuteNonQuery(); 
        } 
       } 
       mysqltransaction.Commit(); 
      } 

Voici comment je le fais, comme je l'ai écrit dans les commentaires, mais il y a beaucoup plus de paramètres, ils sont tous les mêmes que le premier. Lorsque j'envoie des données entre les bases de données, j'ai comme 20 ensembles différents de ce code qui font presque la même chose que le code ici. Mais comme vous comprenez je ne peux pas les montrer tous ..

Parfois, il peut y avoir 3000-4000 lignes qui doivent être insérées, mais souvent petites comme 1-50. Le problème est que je rencontre cette erreur de temps en temps "Lock attente timeout dépassé, essayez de redémarrer la transaction" et je me demande ce que je peux faire pour l'éviter?

Aussi la solution entière semble lente. Est-ce que je peux faire une sous-sélection pour chaque requête d'insertion?

Merci!

Répondre

1

Vous pouvez insérer plusieurs lignes à la fois en utilisant cette syntaxe:

INSERT INTO table (col1, col2) VALUES ('a', 1), ('b', 2), ('c', 3) 

Ce insérera trois lignes à la fois et est beaucoup plus vite.