事务范围 未捕获异常
本文关键字:捕获异常 范围 事务 | 更新日期: 2023-09-27 17:55:42
我看了几个线程,似乎没有一个有帮助,所以这是我的TransActionScope代码
public void InsertFormData()
{
try
{
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection cnn = new SqlConnection(strConnectionString))
{
cnn.Open();
InsertData(cnn);
InsertMoreInfo(cnn);
//etc...
ts.Complete();
}
}
}
catch (Exception ex)
{
LogException(ex);
}
下面是我在那里调用的一个方法的示例:
public void InsertData(cnn)
{
SqlCommand cmd = null;
SqlTransaction trans = null;
try
{
cmd = new SqlCommand("StoredProcedure", cnn, trans);
trans = cnn.BeginTransaction();
cmd.Parameters.Add("@PARAM1", SqlDbType.Int);
cmd.Parameters["@PARAM1"].Direction = ParameterDirection.Output;
cmd.Parameters.Add("@PARAM2", SqlDbType.VarChar).Value = RepID;
cmd.Parameters.Add("@PARAM3", SqlDbType.VarChar).Value = ViolatorID;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
LogException(ex)
}
}
我已经用几种不同的方式重做了这种方法,结果基本相同。我尝试将 Try/catch 从方法中删除,看看这是否会触发错误,但它只是触发了我在 Global.ascx 中的Application_Error。基本上我只希望它运行方法,如果方法没有正确完成,它会回滚它。
当您以正在执行的方式处理异常时,执行流将允许运行ts.Complete()
调用。也:
- 删除
InsertData
中的catch
, - 在记录后再次投掷
InsertData
catch
,或者 - 使
InsertData
返回一个布尔值以指示成功或失败,并使调用方法仅在成功时调用ts.Complete()
。