В 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, что все процессы поставлены в очередь и просто ждут.
Я подозреваю, что, возможно, иногда в этом коде случаются взаимоблокировки. Это возможно? Рекомендуете ли вы пропустить часть транзакции в этом коде, если не так важно, чтобы все эти операции выполнялись как одна операция?
Моя идея добавить часть транзакции с самого начала заключалась в том, что я где-то читал, что это может повысить производительность. Это правда?
Большое спасибо!