我的应用程序中有以下代码:
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);
}
此代码像往常一样触发数据库类 Dispose() 方法,并且此方法自动将事务提交到数据库,但这使我的数据库处于不一致的状态,因为答案被删除,但问题和民意调查却没有。
有什么方法可以在 Dispose() 方法中检测到它是由于异常而不是关闭块的常规结尾而被调用的,这样我就可以自动回滚?
我不想手动添加 try ... catch 块,我的目标是使用 using 块作为逻辑安全事务管理器,因此如果执行干净,它会提交到数据库,如果发生任何异常,它会回滚。
您对此有什么想法吗?
正如其他人所说,您为此目的使用一次性模式是导致问题的原因。如果这个模式对你不利,那么我会改变这个模式。通过将提交设置为 using 块的默认行为,您假设数据库的每次使用都会导致提交,但事实显然并非如此 - 特别是在发生错误时。显式提交(可能与 try/catch 块结合使用)效果会更好。
然而,如果您确实想保持原样使用该模式, 您可以使用:
bool isInException = Marshal.GetExceptionPointers() != IntPtr.Zero
|| Marshal.GetExceptionCode() != 0;
在您的 Displose 实现中确定是否引发了异常(更多详细信息here http://www.codewrecks.com/blog/index.php/2008/07/25/detecting-if-finally-block-is-executing-for-an-manhandled-exception/).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)