我的应用程序中包含以下代码:

using (var database = new Database()) {
    var poll = // Some database query code.

    foreach (Question question in poll.Questions) {
        foreach (Answer answer in question.Answers) {
            database.Remove(answer);
        }

        // This is a sample line  that simulate an error.
        throw new Exception("deu pau");

        database.Remove(question);
    }

    database.Remove(poll);
}

这段代码照常触发Database类Dispose()方法,并且该方法自动将事务提交到数据库,但是这会导致我的数据库处于不一致状态,因为会删除答案,但不会删除问题和民意测验。

我有任何方法可以在Dispose()方法中检测到它是由于异常而不是关闭块的规则结束而被调用的,因此我可以自动执行回滚吗?

我不想手动添加一个try ... catch块,我的目标是将using块用作逻辑安全的事务管理器,因此如果执行干净就将其提交到数据库,如果发生任何异常则将其回滚。

您对此有何想法?

最佳答案

正如其他人所说,为此目的而使用Disposable模式是造成问题的原因。如果该模式对您不利,那么我将更改模式。通过将commit设置为using块的默认行为,可以假设每次使用数据库都会导致一次commit,显然不是这种情况-尤其是发生错误时。显式提交(可能与try/catch块结合使用)会更好。

但是,如果您真的想继续使用该模式,则可以使用:

bool isInException = Marshal.GetExceptionPointers() != IntPtr.Zero
                        || Marshal.GetExceptionCode() != 0;

在Displose实现中确定是否引发了异常(更多详细信息here)。

关于c# - 从using块内部的异常中检测Dispose(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2830073/

10-17 02:06