简单的.NET事务与数据库没有任何关系?

时间:2013-03-29 17:34:51

标签: .net transactions

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

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

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

如果您只对转换内存操作感兴趣,您应该知道MS曾考虑将软件事务内存(STM)作为.NET Framework的一部分,但这些计划是abandoned由于它的困难。但是,有一个非常古老的MSDN article试图实现一些类似的功能(它为事务访问内存中的值提供了Transactional<T>类型。我从未在实际代码中看到过这种情况。

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

答案 1 :(得分:0)