我有一个 .NET WinForms 应用程序。在其中,我运行了 3 个对数据库不做任何事情的函数。如果有任何失败,我只想回滚函数的操作。
所以我正在寻找一个简单的 .NET 事务示例,但我在谷歌上搜索的所有内容似乎都涉及使用 SQL 事务处理。
谢谢你的帮助。
我有一个 .NET WinForms 应用程序。在其中,我运行了 3 个对数据库不做任何事情的函数。如果有任何失败,我只想回滚函数的操作。
所以我正在寻找一个简单的 .NET 事务示例,但我在谷歌上搜索的所有内容似乎都涉及使用 SQL 事务处理。
谢谢你的帮助。
你可以看看实现 IEdtiableObject,另一个教程。
取决于事务失败时要回滚的操作类型。通常,您需要实现一个或多个资源管理器并将它们登记在事务中才能使其工作。
这是一项非常重要的工作,它可能是你需要镊子的大锤,即你可能不应该尝试它(我同意提到 Memento 模式的评论者,这是值得研究的)。简而言之,没有办法简单地“回滚”方法调用,因为它所做的更改可能涉及不同类型的资源(内存、文件系统、Web 服务等)。
我认为它也充满了各种逻辑上的困难,比如事务应该只回滚您的方法执行的更改,还是应该尝试回滚您的方法调用的其他方法执行的更改?您将如何执行事务的ACID属性?您基本上必须在事务期间阻止任何其他线程访问相同的内存位置,以防止脏读等。关系数据库能够做到这一点,因为它们可以严格控制哪些事务可以访问哪些数据以及何时访问。而在单个进程中,当所有线程共享相同的地址空间时,这要困难得多。
如果您只对逆向内存操作感兴趣,您应该知道,MS 曾一度考虑将软件事务内存 (STM) 作为 .NET 框架的一部分,但由于其困难而放弃了这些计划。但是,有一篇非常古老的MSDN 文章试图实现一些类似的功能(它提供了Transactional<T>
一种用于对内存中的值进行事务访问的类型)。不过,我从未见过在实际代码中使用它。
它可能会成为一个有趣的研究项目。对于其他任何事情,底线是不要这样做。;-)