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