【问题标题】:Simple .NET transaction that doesn't have anything to do with database?与数据库没有任何关系的简单 .NET 事务?
【发布时间】:2013-03-29 17:34:51
【问题描述】:

我有一个 .NET WinForms 应用程序。在其中,我运行了 3 个对数据库不做任何事情的函数。如果有任何失败,我只想回滚函数的操作。

所以我只是在寻找一个简单的 .NET 事务示例,但我在 Google 上搜索的所有内容似乎都涉及使用 SQL 事务处理。

感谢您的帮助。

【问题讨论】:

标签: .net transactions


【解决方案1】:

取决于在事务失败时要回滚的操作类型。通常,您需要实现一个或多个资源管理器并将它们登记到事务中才能使其工作。

这是一项非常重要的任务,它可能是你需要镊子的大锤,即你可能不应该尝试它(我同意提到 Memento 模式的评论者,这是值得研究的)。简而言之,没有办法简单地“回滚”方法调用,因为它所做的更改可能涉及不同类型的资源(内存、文件系统、Web 服务等)。

我认为它也充满了各种逻辑上的困难,比如事务应该回滚您的方法执行的更改,还是还应该尝试回滚您的方法调用的其他方法执行的更改?您将如何执行事务的ACID 属性?您基本上必须在事务期间阻止任何其他线程访问相同的内存位置,以防止脏读等。关系数据库能够做到这一点,因为它们可以严格控制哪些事务可以访问哪些数据以及何时访问。而在单个进程中,当所有线程共享相同的地址空间时,这要困难得多。

如果您只对逆向内存操作感兴趣,您应该知道,MS 曾一度考虑将软件事务内存 (STM) 作为 .NET 框架的一部分,但由于其困难,这些计划是abandoned .然而,有一个非常古老的MSDN article 试图实现一些类似的功能(它提供了一个Transactional<T> 类型用于对内存中的值进行事务访问)。不过,我从未见过在实际代码中使用它。

它可能会成为一个有趣的研究项目。对于其他任何事情,底线是不要这样做。 ;-)

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2014-01-30
      • 2018-08-18
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多