【发布时间】:2020-04-08 20:34:52
【问题描述】:
我们可以在 C# 对象上使用事务吗?
所有事务是否仅适用于 MSSQL、ORACLE 等关系数据库...??
谢谢。
【问题讨论】:
我们可以在 C# 对象上使用事务吗?
所有事务是否仅适用于 MSSQL、ORACLE 等关系数据库...??
谢谢。
【问题讨论】:
你问的是Software Transactional Memory。由于目前这是一个开放的研究领域,并且目前没有原生 C# 语言支持,因此您最好使用 existing synchronization options for C#,例如 lock 关键字、监视器、等待句柄等。
如果您确实需要高级事务功能,有很多库实现,请参阅 Wikipedia 中的此列表以获取一些示例:
【讨论】:
您可能对Software Transactional Memory 感兴趣。它在 .NET 世界中存在一种实现,名为 STM.NET。
软件事务内存 (STM.NET) 是一种高效的机制 共享状态的隔离。这 程序员划分代码区域 作为在交易中运作 是“原子的”并且与其他“隔离” 事务代码并发运行。
这是微软 STM.NET 团队的博客:http://blogs.msdn.com/stmteam/
【讨论】:
有关如何在 OOP 中实现事务的精彩讨论,请查看discussion。在那里突出显示备忘录和状态模式以实现事务行为(以及其他方法)。
【讨论】:
看看软件事务内存 (STM.NET)。
它没有进入 .Net 4,但可以单独下载
【讨论】:
Joe Duffy 的博客上有一个Interesting article,内容是关于在 MS 进行事务性内存的尝试。如果我总结一下,我会说:如果是为了好玩,请自己做。
【讨论】:
看起来微软已经远离了 stm。这里给出了一些推理https://www.infoq.com/news/2010/05/STM-Dropped,尽管我并没有完全相信它的弱原子就地修改论点。我认为所有对象状态都必须位于事务中的强原子事务仍然具有优点。
【讨论】:
对于 c# 对象没有类似 SQL 的事务,但如果这是因为你有线程问题,你应该使用lock:
lock (myList)
{
if (myList.Count > 0)
myList.Clear();
}
这只是清除一个列表,但确保它不能被另一个线程同时修改。
【讨论】:
您可以使用TransactionScope Class。
【讨论】: