0

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

事务(进程 ID 59)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。

当我查看表格时,我看到 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;
}
4

0 回答 0