使用MySql事务可能出现死锁?

时间:2012-01-18 08:53:48

标签: asp.net mysql transactions deadlock

在asp.net中我有一个Web服务,我发送一个项目列表,需要在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%的CPU和25%的内存。)当发生这种情况时,我可以在phpmyadmin中看到,所有进程都排队等待。

我的怀疑是,有时候上面的代码中会发生死锁。这有可能吗?如果所有这些操作作为单个操作运行并不重要,您是否建议我跳过此代码中的事务部分?

我从一开始就添加交易部分的想法是因为我在某处读到这可以给我带来更好的性能。这是真的吗?

非常感谢!

0 个答案:

没有答案