mysql error: превышено время ожидания блокировки - PullRequest
1 голос
/ 15 сентября 2009

Я использую mysql вместе с asp.net на моем веб-сервере. Я также использую базу данных sqlite, чтобы иметь возможность использовать базу данных на другом устройстве. Мне нужно отправить данные между двумя базами данных. Это то, что нужно делать много раз в день. Вот пример того, как я это делаю:

    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();
            }

Вот как я это делаю, как я писал в комментариях, есть еще много параметров, но они все такие же, как и первый. При отправке данных между базами данных у меня есть 20 различных наборов этого кода, которые делают почти то же самое, что и код здесь. Но, как вы понимаете, я не могу показать их все ..

Иногда может быть 3000-4000 строк, которые нужно вставить, но часто маленькие, как 1-50.

Проблема в том, что я время от времени сталкиваюсь с этой ошибкой "Превышено время ожидания блокировки; попробуйте перезапустить транзакцию" и задаюсь вопросом, что я могу сделать, чтобы ее избежать?

Также все решение кажется медленным. Может ли быть так, что мне нужно сделать отбор для каждого запроса вставки?

Спасибо!

1 Ответ

1 голос
/ 15 сентября 2009

Вы можете вставить несколько строк одновременно, используя этот синтаксис:

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

Это вставит три строки одновременно и будет намного быстрее.

...