14

我对 TransactionScope 类很好奇。

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

我的问题是,您可以将任何代码放在 TransactionScope 的 using-block 中以使其具有事务性吗?MS 文档对此并不清楚。

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

4

2 回答 2

13

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

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

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

于 2010-02-16T15:22:52.253 回答
6

不,您不能通过在TransactionScope.

正如您在评论中指出的那样,System.Transactions命名空间提供了基础设施类来帮助使任何资源事务化。默认情况下,.NET 为多种操作提供资源管理器支持,在您链接的命名空间介绍中列出(在评论中):“SQL Server、ADO.NET、MSMQ 和 Microsoft 分布式事务协调器 (MSDTC)”。

事实证明,它支持文件系统事务——尽管我只能为 NTFS 找到它(使用文件系统事务增强您的应用程序)。不过,就我的钱而言,该代码可能会严重使用外观。;) 也许还有其他更通用的实现(或者可能没有 - 使文件 IO 事务性可能需要 NTFS 提供的额外基础设施)。

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

于 2010-02-16T14:09:15.780 回答