2012-03-15 48 views
-1

我有这样的代码:重新抛出异常导致我的数据不保存

catch (Exception e) 
{ 
    try 
    { 
     transmitModel.AddAck(transmitBatchId, 
      "<error><message>" + e.Message + "</message><stack>" + e.StackTrace + 
      "</stack><Location>FromLisAtOMServer<Location>" + 
      "<TransmitBatchId>" + message.TransmitBatchId + 
      "</TransmitBatchId></error>", false, true); 
    } 
    // If we fail to log, we don't want that to bubble up... 
    // We want the real error to do that. 
    catch (Exception){} 

    // Re-throw the exception so that the service bus will 
    // move this off to the error queue.); 
    throw; 
} 

的AddAck方法将保存该字符串到数据库(使用实体框架)。

当我运行这个没有最后一条语句throw,它将我的错误消息保存到数据库罚款。

当我有throw;在那里,它说它保存,但是当我查询数据库它不在那里。我甚至可以在保存之后(在代码中)通过我的数据上下文运行一个实体查询,并且它返回值就好像它被保存了一样(尽管这可能是使用缓存版本)。但是,如果我去后查询数据是不存在的......

我已检查以确保没有其他逻辑导致值在异常时被删除。

任何想法可能导致这种情况?

+5

听起来像你没有提交数据库交易? – 2012-03-15 15:22:38

+0

但是,提交日志到db的代码在哪里呢? – Tigran 2012-03-15 15:26:48

+0

这个事务不是通过finally语句的某个地方回滚了吗? – 2012-03-15 15:26:51

回答

3

OK,后这里的答案,谈到在我的脑海为我所用遇见同样的问题,很容易,并发现它只是造成我没有提交数据库事务。 谢谢,:)

0

此调用是NServiceBus消息的结果。

我忘了我的NServiceBus的东西在分布式事务中运行。所以当我抛出异常时,它会回滚所有待处理的更改。

我需要找出如何得到这个日志文件张贴事务外...

0

NServiceBus可能为这种事情提供钩子。

你的问题很可能是你所说的:消息处理发生在一个事务中。你不能承诺,否则你也犯了错误。所以你一定要找出你可以挂钩到邮件处理异常处理的位置。

使用Shuttle ESB(http://shuttle.codeplex.com/),我们使用管道来处理不同的用例,并且可以挂钩各种管道引发的PipelineException事件。 Shuttle有能力让开发人员添加挂钩到各种事件中的模块。已经有一个SystemExceptionModule或多或少做你想做的事情。