2013-03-11 50 views
0

我在COM +中運行的方法,它看起來有點像下面這樣:提交事務,如果它的一部分失敗

[AutoComplete(true)] 
public bool DoSomething(string args) 
{ 
    DoSomeDBWork(args); 
    try { 
     DBAccess.RunQuery("INSERT fail"); 
     return 0; 
    } 
    catch (Exception ex) 
    { 
     //Hide the error because it doesnt matter - log it out though for completeness 
     DBAccess.RunQuery("INSERT INTO Log VALUES ('{0}')", ex.ToString()); 
     return -1 
    } 
} 

OK所以這種方法運行時,DoSomeDBWork()方法運行,做了一些最新信息DB。

'insert fail'運行失敗。 我只是想忽略它,但註銷它失敗了。

但是我收到了一個錯誤: System.Transactions.TransactionException:該操作對事務狀態無效。

我假設即使我發現異常,因爲它是數據庫錯誤,它會自動回滾事務。
錯誤來自'insert into log ...'
以及在DoSomeDBWork()中更新的所有內容也會回滾。

如何忽略失敗的線?

回答

1

您將不得不回滾用於「插入失敗...」的事務,然後在之前嘗試插入日誌。不熟悉DBAccess及其工作方式,但一旦回滾,您應該能夠隱式或顯式地啓動新的事務。

[AutoComplete(true)] 
public bool DoSomething(string args) 
{ 
    DoSomeDBWork(args); 
    try { 
     DBAccess.RunQuery("INSERT fail"); 
     return 0; 
    } 
    catch (Exception ex) 
    { 
     DBAccess.Rollback(); 
     DBAccess.RunQuery("INSERT INTO Log VALUES ('{0}')", ex.ToString()); 
     return -1 
    } 
} 
+0

但是,如果我在我的catch中做了回滾 - 它也將回滾'DoSomeWork'中早些時候做的所有事情嗎?我無法執行除了失敗的那一行以外的所有內容嗎? – 2013-03-11 13:15:22

+1

我沒有看到這個要求,對不起。在這一點上,你將不得不引入一個嵌套事務。再次,不知道如何編寫** DBAccess **,但我的猜測是需要修改以支持嵌套事務並確保「INSERT Fail」在該事務的範圍內運行。 – sanbornc 2013-03-11 14:37:33