【发布时间】:2012-05-12 21:32:11
【问题描述】:
我想让一个父对象删除自己,它是单个事务范围中的子对象。我还想在这两种情况下检查要删除的对象是否存在,以及用户是否有权访问该对象。考虑以下代码:
我得到服务器上的 MSDTC 不可用异常。有没有办法通过我的服务方法传递连接?
请看下面的例子:
// 类 Flight, 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的代码贴出来吗?
-
我很好奇为什么这会试图升级为 DTC 交易。飞行员和航班是在不同的数据库上,还是使用不同的连接字符串?快速解决方法是在您的 Web 服务器上启用 DTC,但 DTC 事务非常昂贵,最好使用本机 SQL 事务。
-
是的,谢谢你们的及时回复!我将使用 DAO 实现和错误编辑原始帖子。
标签: c# transactionscope msdtc