Я хочу, чтобы родительский объект удалял себя, и это дочерний объект в одном транзакционном устройстве. Я также хочу проверить оба случая, если объект для удаления существует, и если пользователь имеет права на объект. Рассмотрим следующий код:C# Transactionscope - вставить/выбрать в той же транзакции, несколько подключений
Я получаю MSDTC на сервере, исключая исключение. Есть ли способ передать соединение через мои методы обслуживания?
Пожалуйста, смотрите пример ниже:
// классы полета, FlightService, FlightDao // классы Pilot, PilotService, PilotDao
// 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();
}
}
}
Можете ли вы опубликовать код DAO, где исключение бросают? – MrJames
Мне любопытно, почему это пытается перерасти в транзакцию DTC. Являются ли пилоты и полеты в разных базах данных или с использованием разных строк соединения? Быстрое исправление заключается в том, чтобы включить DTC на вашем веб-сервере, но транзакции DTC очень дороги, и было бы лучше использовать собственную транзакцию SQL. –
Да, спасибо за подсказку ребята! Я отредактирую исходный пост с реализацией DAO и ошибкой. –