我们能在C#对象上实现事务吗?

9

我们能在C#对象上使用事务吗?

所有的事务都只能用于关系型数据库,如MSSQL、ORACLE等吗?

谢谢。


请注意,此问题已经有了重复的答案,请查看以下链接:https://dev59.com/W0vSa4cB1Zd3GeqPcS-d - Mark Seemann
8个回答

5

4

您可能对软件事务性内存感兴趣。在.NET世界中有一个实现,名为STM.NET

软件事务性内存(STM.NET)是一种有效隔离共享状态的机制。程序员将代码区域划分为在事务内运行的"原子"和"隔离"于同时运行的其他交易代码。

这是微软STM.NET团队的博客:http://blogs.msdn.com/stmteam/


你关于STM的看法是正确的,但不要忘记指出STM仍处于研究和开发阶段,我不会在生产软件中使用它。 - Steven

1

关于如何在面向对象编程中实现事务,可以参考这个讨论。其中强调了备忘录模式和状态模式等方法来实现事务行为。


1

看看软件事务内存(STM.NET)。

它没有被纳入 .Net 4,但可以作为单独的下载使用。


1

Joe Duffy在他的博客上发表了一篇有趣的文章,讲述了微软尝试进行事务内存的经历。如果我要总结一下,我会说:只有当你觉得有趣时才自己去尝试。


1

看起来微软已经放弃了stm。一些原因在这里给出https://www.infoq.com/news/2010/05/STM-Dropped,尽管我对其弱原子性的就地修改论点还没有完全信服。我认为一个强原子事务,在其中所有对象状态必须位于事务内仍然具有价值。


0

对于C#对象,没有类似SQL的事务处理,但如果这是由于线程问题,您应该使用lock

lock (myList)
{
    if (myList.Count > 0)
        myList.Clear();
}

这只是清除一个列表,但确保在同一时间其他线程无法修改它。


0

这完全是错误的,TransactionScope 只用于数据库。 - Idan
嗯,不是的。它可以用于实现IEnlistmentNotification的任何内容。 - vtortola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接