事务范围 未捕获异常

本文关键字:捕获异常 范围 事务 | 更新日期: 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()