【问题标题】:Can we implement Transaction on C# objects?我们可以在 C# 对象上实现事务吗?
【发布时间】:2020-04-08 20:34:52
【问题描述】:

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

所有事务是否仅适用于 MSSQL、ORACLE 等关系数据库...??

谢谢。

【问题讨论】:

标签: c# .net


【解决方案1】:

你问的是Software Transactional Memory。由于目前这是一个开放的研究领域,并且目前没有原生 C# 语言支持,因此您最好使用 existing synchronization options for C#,例如 lock 关键字、监视器、等待句柄等。

如果您确实需要高级事务功能,有很多库实现,请参阅 Wikipedia 中的此列表以获取一些示例:

【讨论】:

    【解决方案2】:

    您可能对Software Transactional Memory 感兴趣。它在 .NET 世界中存在一种实现,名为 STM.NET。

    软件事务内存 (STM.NET) 是一种高效的机制 共享状态的隔离。这 程序员划分代码区域 作为在交易中运作 是“原子的”并且与其他“隔离” 事务代码并发运行。

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

    【讨论】:

    • 您对 STM 的看法是对的,但不要忘记注意 STM 仍处于研究、开发阶段,我不会在生产软件中使用它。
    【解决方案3】:

    有关如何在 OOP 中实现事务的精彩讨论,请查看discussion。在那里突出显示备忘录和状态模式以实现事务行为(以及其他方法)。

    【讨论】:

      【解决方案4】:

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

      它没有进入 .Net 4,但可以单独下载

      【讨论】:

        【解决方案5】:

        Joe Duffy 的博客上有一个Interesting article,内容是关于在 MS 进行事务性内存的尝试。如果我总结一下,我会说:如果是为了好玩,请自己做。

        【讨论】:

          【解决方案6】:

          看起来微软已经远离了 stm。这里给出了一些推理https://www.infoq.com/news/2010/05/STM-Dropped,尽管我并没有完全相信它的弱原子就地修改论点。我认为所有对象状态都必须位于事务中的强原子事务仍然具有优点。

          【讨论】:

            【解决方案7】:

            对于 c# 对象没有类似 SQL 的事务,但如果这是因为你有线程问题,你应该使用lock:

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

            这只是清除一个列表,但确保它不能被另一个线程同时修改。

            【讨论】:

              【解决方案8】:

              您可以使用TransactionScope Class。

              【讨论】:

              • 这是完全不正确的,TransactionScope只用于DB
              • 嗯.. 没有。它可以用于任何实现 IEnlistmentNotification
              猜你喜欢
              • 2014-01-09
              • 1970-01-01
              • 1970-01-01
              • 2019-05-29
              • 2013-08-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多