这两个处理sqltransaction的方法基本相同吗?

时间:2014-09-11 03:24:42

标签: c# transactions sqltransaction

我正在尝试创建一个运行Transaction的方法 我提出了两个版本的代码,因为我猜第一个实际上并没有做我期望它做的事。
在我的一个测试中,在遇到异常之后,我注意到SqlServer2012中的表格中插入了几行,尽管它们处于交易中。
所以我认为这必然是交易本身的问题,我改变它来应对这个问题 通过使用4个插入,1个删除和1个更新以及另一个插入命令运行此方法得到的异常是:

  

事务(进程ID 59)在锁定资源上死锁   另一个进程并被选为死锁受害者.Rerun   交易。

当我查看表格时,我看到3个新插入的行(达到更新然后发生异常)!!

更新 这两种方法现在抛出相同的异常。 对于第二种方法,我在添加新参数和清除旧值方面也遇到了一些困难。

这是第一个版本:

public static int ExecuteTransaction(List<SqlCommand> Commands, IsolationLevel isolationLevel)
{
    int record = -1;
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();
        SqlTransaction tr = con.BeginTransaction(isolationLevel);
        try
        {
            foreach (SqlCommand cmd in Commands)
            {
                cmd.Connection = con;
                cmd.Transaction = tr;
                record = cmd.ExecuteNonQuery();
                cmd.Dispose();
            }

            tr.Commit();
        }
        catch (Exception ex)
        {
            tr.Rollback();
            throw ex;
        }
    }

    return record;
}

这是第二个版本:

public static int ExecuteTransaction(List<SqlCommand> Commands, IsolationLevel isolationLevel)
{
    int record = -1;
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();
        SqlTransaction tr = con.BeginTransaction(isolationLevel);
        try
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = con;
                cmd.Transaction = tr;
                foreach (SqlCommand sqlcmd in Commands)
                {
                    cmd.CommandText = sqlcmd.CommandText;
                    cmd.Parameters.Clear();
                    foreach (SqlParameter param in sqlcmd.Parameters)
                    {
                        cmd.Parameters.AddWithValue(param.ParameterName, param.Value);
                    }
                    record = cmd.ExecuteNonQuery();
                    sqlcmd.Dispose();
                }
            }


            tr.Commit();
        }
        catch (Exception ex)
        {
            tr.Rollback();
            throw ex;
        }
    }

    return record;
}

0 个答案:

没有答案