0
votes

I have a method inside a main one. I need the child method to be able to roll back if the parent method fails. The two data connections use different servers . Before I added the transaction scopes, they worked well. But when I tie them together, the child method aborts.

Edit: Error message: Network access for distributed transaction Manager(MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using Component Service Administrative tool.

public static void LoopStudent() 
{
  try 
  {
    using(TransactionScope scope = new TransactionScope()) 
    {
      String connString = ConfigurationManager.AppSettings["DBConnection"];
      using(SqlConnection webConn = new SqlConnection(connString)) 
      {
        webConn.Open();
        String sql = "select * from students";
        using(SqlCommand webComm = new SqlCommand(sql, webConn)) 
        {
          using(SqlDataReader webReader = webComm.ExecuteReader()) 
          {

            if (webReader.HasRows) 
            {
              while (webReader.Read()) 
              {
                int i = GetNextId();
              }
            } 
            else 
              Console.WriteLine("wrong");
          }
        }
      }

      scope.Complete();
    }
  }
  catch (Exception ex) 
  {
    Console.WriteLine("Error " + ex.Message);
  }

} //End LoopThroughCart         

public static int GetNextId(String str) 
{
  int nextId = 0;
  String connString = ConfigurationManager.AppSettings["SecondDBConnection"];
  try 
  {
    using(TransactionScope scope = new TransactionScope()) 
    {
      using(SqlConnection webConn = new SqlConnection(connString)) 
      {
        webConn.Open();
        using(SqlCommand webComm = new SqlCommand("GetNextId", webConn)) 
        {
          //do things
        }
      }
      scope.Complete();
    }
  } 
  catch (TransactionAbortedException ex) 
  {
    Console.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
  } 
  catch (ApplicationException ex) 
  {
    Console.WriteLine("ApplicationException Message: {0}", ex.Message);
  }
  return nextId;
} //End GetNextId
1

1 Answers

0
votes

If you do not use RequireNew in you inner method, the inner method will be automatically rolled back if the parent fails to commit the transaction.

What error are you getting?