我们可以在asp.net的事务范围中调用两个不同的方法吗?

时间:2012-12-18 07:09:43

标签: c# asp.net transactions transactionscope rollback

您好我是C#中交易范围的新手。我有两个插入查询,一个属于UserAccountCreation,其中存储了LoginCredentials,另一个是插入员工详细信息,其中Employee表中的UserAccountID为外键。

我在UserAccount表中编写了两种不同的方法,在插入UserAccount后,UserAccountID被提供并插入到Employee表中。 情况是当UserAccount创建成功并且Employee Creation失败时,它必须ROLLBACK。那么,我想知道我们是否可以使用Transaction scope并在两者之间调用这两个Insert方法?如果发生错误,我们可以回滚这些在此范围内调用的方法吗? 示例代码:

private void CreateEmp()
{
  using (TransactionScope scope = new TransactionScope())
  {
    try
    {
        CreateUserAccount();
        CreateEmployee();
        scope.Complete();
    } 
    catch (TransactionAbortedException ex)
        {

    }
  }
}

帮助感谢! 在此先感谢!

4 个答案:

答案 0 :(得分:2)

This应该回答你的问题。要快捷方式,只需阅读代码示例中的注释

答案 1 :(得分:1)

您可以在事务范围内调用任意数量的函数。 如果你想要两个方法可以处理他们自己的连接(open / use / close / dispose),但是他们将默默地成为环境事务的一部分,而我们不必传递任何东西。

答案 2 :(得分:0)

是。这就是我们使用交易范围的原因。

答案 3 :(得分:0)

手头的任务: 当用户点击“更新”按钮时,我需要在4个表中插入一行。

以下对我有用:

我在4个更新方法所在的类中添加了一个变量,如果在4个方法中的任何一个中捕获到异常,则将其设置为false。在没有这个的情况下拨打tran.Complete();对我不起作用。

/* This variable is used to check if updating the scorecard succeeded. 
Set this variable to false in catch blocks of the 4 update methods. */

private bool bAllUpdated = true;

我的更新点击方法如下所示:

/* Showing the try-catch block only */
try
{
    using (TransactionScope tran = new TransactionScope())
    {
         UpdateMethod1();
         UpdateMethod2();
         UpdateMethod3();
         UpdateMethod4();

         if (bAllUpdated == true)
         {
             tran.Complete();
             lblSC_Success.Visible = true;
         }
         else
             throw new TransactionAbortedException();
    }
}

catch (TransactionAbortedException ex)
{
      bAllUpdated = false;
      lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
catch (ApplicationException ex)
{
    bAllUpdated = false;
    lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
catch (Exception ex)
{
    bAllUpdated = false;
    lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
finally
{
    // Clean up the temp tables
    // Refresh page
}