我的应用程序中包含以下代码:
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/