【问题标题】:C# - System.Transactions.TransactionScopeC# - System.Transactions.TransactionScope
【发布时间】:2010-02-16 14:07:39
【问题描述】:

我对 TransactionScope 类很好奇。

在大多数情况下,我认为它是为数据库连接而设计的(这是我使用它的目的)。

我的问题是,您能否将 any 代码放入 TransactionScope 的 using-block 中以使其具有事务性? MS 文档对此并不清楚。

如果它可以用于使数据库连接以外的代码成为事务性的,那么哪些是受支持的?如果它可以使 System.IO.File 操作成为事务性操作,我会觉得很疯狂。

【问题讨论】:

标签: c# .net transactions transactionscope


【解决方案1】:

TransactionScope 不仅适用于数据库。每个实现 IEnlistmentNotification 接口的组件都可以参与事务范围的两阶段提交。

以下是事务性内存存储的示例: http://www.codeproject.com/KB/dotnet/Transactional_Repository.aspx

另外,我不确定 .NET 中是否有用于事务文件 IO 的组件,但实现这样的组件非常容易 - Vista 和 Windows Server 2008 等最新操作系统支持事务文件 IO。

【讨论】:

【解决方案2】:

不,您不能通过在TransactionScope 中运行任意代码来使其具有事务性。

正如您在评论中指出的那样,System.Transactions 命名空间提供了infrastructure classes to help make any resource transactional。默认情况下,.NET 为多种操作提供资源管理器支持,在您链接的命名空间介绍中列出(在评论中):“SQL Server、ADO.NET、MSMQ 和 Microsoft 分布式事务协调器 (MSDTC)。”

事实证明,文件系统事务支持 - 虽然我只能找到 NTFS (Enhance Your Apps With File System Transactions)。不过,就我的钱而言,该代码可能会严重使用外观。 ;) 也许还有其他更通用的实现(或者可能没有 - 使文件 IO 事务性可能需要 NTFS 提供的额外基础设施)。

还有大量正在进行的关于更改内存状态事务的研究,称为software transactional memory。 Microsoft DevLabs 提供了一个实现:STM.NET

【讨论】:

  • 该项目似乎只支持使用内存中的事务状态。这与支持所有代码事务(如我上面提到的 System.IO)相去甚远。除了数据库连接之外,TransactionScope 还支持什么?
  • TransactionScope 和 Transactions 用于数据库——它们还能用于什么?
  • 这个页面提到了一些其他的东西:msdn.microsoft.com/en-us/library/system.transactions.aspx,它谈到了除了数据库(MSMQ)和实现“资源管理器”的能力之外的其他东西。那么你能实现一些东西来让其他事情成为事务性的吗?
  • @change 用于可能需要回滚的任何内容。 Ctrl-z,除非由事务的一部分失败而不是用户输入触发。
  • @jon 交易并不神奇。您不仅要编写事务中发生的事情,还要编写如何撤消您所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多