Возможен ли тупик при использовании транзакций MySql? - PullRequest
0 голосов
/ 18 января 2012

В asp.net у меня есть веб-служба, которая отправляет список элементов, которые необходимо вставить, обновить или удалить в базе данных MySql.

MySqlConnection mysqlconn = new MySqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
mysqlconn.Open();    
MySqlCommand mysqlcmd = new MySqlCommand();
mysqlcmd.Connection = mysqlconn;

Я использую транзакции для этого:

using (MySqlTransaction mysqltransaction = mysqlconn.BeginTransaction())
{
    using (mysqlcmd)
    {
        MySqlParameter parmItemid = new MySqlParameter("?itemid", MySqlDbType.Int32);
        mysqlcmd.Parameters.Add(parmItemid);
        MySqlParameter parmProductid = new MySqlParameter("?productid", MySqlDbType.Int32);
        MySqlParameter parmAmount = new MySqlParameter("?amount", MySqlDbType.Int32);
        mysqlcmd.Parameters.Add("?userid", userid);

        foreach (Item item in list)
        {
            parmItemid.Value = item.id;
            parmProductid.Value = item.productid;
            parmAmount.Value = item.value;

            if (item.type == 1)
            {
                mysqlcmd.CommandText = "INSERT INTO tblitem (itemid,userid,productid,value) VALUES (?itemid,?userid,?productid,?value)";
            }
            else if (item.type == 2)
            {
                mysqlcmd.CommandText = "UPDATE tblitem SET productid=?productid,value=?value WHERE userid=?userid AND itemid=?itemid";
            }
            else
            {
                mysqlcmd.CommandText = "DELETE FROM tblitem WHERE userid=?userid AND itemid=?itemid";
            }
            mysqlcmd.ExecuteNonQuery();
        }
    }
    mysqltransaction.Commit();
}

У меня много трафика на моем сайте, и иногда кажется, что база данных полностью заблокирована. (Даже если я использую только 5% процессора и 25% памяти.) Когда это происходит, я вижу в phpmyadmin, что все процессы поставлены в очередь и просто ждут.

Я подозреваю, что, возможно, иногда в этом коде случаются взаимоблокировки. Это возможно? Рекомендуете ли вы пропустить часть транзакции в этом коде, если не так важно, чтобы все эти операции выполнялись как одна операция?

Моя идея добавить часть транзакции с самого начала заключалась в том, что я где-то читал, что это может повысить производительность. Это правда?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...