如果部分失败,则提交事务

时间:2013-03-11 10:39:26

标签: c# transactions servicedcomponent

我有一个在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
    }
}

确定所以方法运行,DoSomeDBWork()方法运行,对数据库进行一些更新。

“插入失败”运行,失败。 我只是想忽略它,但注销它失败了。

但是我收到了错误: System.Transactions.TransactionException:该操作对事务状态无效。

我假设即使我抓住了Exception,因为它是一个DB错误,它会自动回滚事务。
错误来自“插入日志...”行 并且还会回滚在DoSomeDBWork()中更新的所有内容。

如何忽略失败的线?

1 个答案:

答案 0 :(得分: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
    }
}