C# C Transactionscope-在同一事务中插入/选择多个连接

C# C Transactionscope-在同一事务中插入/选择多个连接,c#,transactionscope,msdtc,C#,Transactionscope,Msdtc,我想让父对象在单个transactionscope中删除它自己及其子对象。我还想在这两种情况下检查要删除的对象是否存在,以及用户是否拥有该对象的权限。考虑下面的代码: 我得到服务器上的MSDTC不可用异常。是否仍有通过我的服务方法传递连接的方法 请参见下面的示例: //航班、航班服务、航班服务 //飞行员、飞行员服务、飞行员道 // FlightService public void deleteFlight(Flight flight) { FlightDao flightDao =

我想让父对象在单个transactionscope中删除它自己及其子对象。我还想在这两种情况下检查要删除的对象是否存在,以及用户是否拥有该对象的权限。考虑下面的代码:

我得到服务器上的MSDTC不可用异常。是否仍有通过我的服务方法传递连接的方法

请参见下面的示例:

//航班、航班服务、航班服务 //飞行员、飞行员服务、飞行员道

// FlightService
public void deleteFlight(Flight flight) {
    FlightDao flightDao = new FlightDao();
    Flight existingFlight = flightDao.findById(flight.Id);
    if (existingFlight != null) {
        using (TransactionScope scope = new TransactionScope()) {
            try {
                PilotService.Instance.deletePilot(flight.Pilot);
                flightDao.delete(flight);
            } catch (Exception e) {
                log.Error(e.Message, e);
                throw new ServiceException(e.Message, e);
            }
            scope.Complete();   
        }
    }       
}

// PilotService
public void deleteFlight(Pilot pilot) {
    PilotDao pilotDao = new PilotDao();
    Pilot existingPilot = pilotDao.findById(pilot.Id); // THIS LINE RIGHT HERE THROWS EXCEPTION
    if (existingPilot != null) { 
        using (TransactionScope scope = new TransactionScope()) {
            try {               
                pilotDao.delete(pilot);
            } catch (Exception e) {
                log.Error(e.Message, e);
                throw new ServiceException(e.Message, e);
            }
            scope.Complete();   
        }
    }       
}

您正在对事务使用多个数据上下文层。你需要把一个传给另一个。 deletePilot调用应在相同的数据上下文中执行。一种解决方案是让数据访问层的构造函数从另一个数据服务接受数据上下文。它们将在相同的上下文中执行操作

public void deleteFlight(IYourDataContext context, Pilot pilot) {
PilotDao pilotDao = new PilotDao(context);
//do operations now in same context.
...

您正在对事务使用多个数据上下文层。你需要把一个传给另一个。 deletePilot调用应在相同的数据上下文中执行。一种解决方案是让数据访问层的构造函数从另一个数据服务接受数据上下文。它们将在相同的上下文中执行操作

public void deleteFlight(IYourDataContext context, Pilot pilot) {
PilotDao pilotDao = new PilotDao(context);
//do operations now in same context.
...

这里的问题是,我试图在同一个循环中多次使用同一个SqlDataReader。这在事务内部显然不起作用

例如:

SqlCommand command = new SqlCommand(...);
SqlDataReader reader = command.ExecuteReader();
if (reader.read()) {
  return buildMyObject(reader);
}

private MyObject buildMyObject(SqlDataReader reader) {
  MyObject o1 = new MyObject();
  // set fields on my object from reader

  // broken! i was attempting create a new sql connection here and attempt to use a reader
  // but the reader is already in use.
  return o1;
}

这里的问题是,我试图在同一个循环中多次使用同一个SqlDataReader。这在事务内部显然不起作用

例如:

SqlCommand command = new SqlCommand(...);
SqlDataReader reader = command.ExecuteReader();
if (reader.read()) {
  return buildMyObject(reader);
}

private MyObject buildMyObject(SqlDataReader reader) {
  MyObject o1 = new MyObject();
  // set fields on my object from reader

  // broken! i was attempting create a new sql connection here and attempt to use a reader
  // but the reader is already in use.
  return o1;
}

您可以发布引发异常的DAO代码吗?我很好奇为什么这会试图升级到DTC事务。飞行员和航班是在不同的数据库上,还是使用不同的连接字符串?快速修复方法是在您的web服务器上启用DTC,但DTC事务非常昂贵,最好使用本机SQL事务。是的,感谢您的及时回复!我将编辑带有DAO实现和错误的原始帖子。您能发布引发异常的DAO代码吗?我很好奇为什么这会试图升级为DTC事务。飞行员和航班是在不同的数据库上,还是使用不同的连接字符串?快速修复方法是在您的web服务器上启用DTC,但DTC事务非常昂贵,最好使用本机SQL事务。是的,感谢您的及时回复!我将编辑带有DAO实现和错误的原始帖子。