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

本文关键字:事务 选择 连接 插入 范围 | 更新日期: 2023-09-27 18:33:55

我想让一个父对象在单个事务范围内删除自身和子对象。 我还想在这两种情况下检查要删除的对象是否存在,以及用户是否对该对象具有权限。 请考虑以下代码:

我得到服务器上的 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();   
        }
    }       
}

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

您正在对事务使用多个数据上下文层。您需要将一个传递给另一个。 "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;
}