我正在尝试创建一个运行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;
}