2012-03-15 44 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或多或少做你想做的事情。