C# - System.Transactions.TransactionScope

14
我对TransactionScope类很感兴趣。我认为它主要是用于数据库连接(我也是这样使用的)。
我的问题是,在TransactionScope的using-block中,你可以放入任何代码使其具有事务性吗?微软的文档没有明确说明。
如果它可以用于使除了数据库连接之外的代码具有事务性,那么支持哪些代码?如果它可以使System.IO.File操作具有事务性,那听起来似乎很疯狂。

如果System.IO.File操作可以通过事务来执行,那对我来说似乎有些疯狂。但是在Vista及更高版本中,您可以使用TxF实现这一点-请查看http://alphafs.codeplex.com/。 - Charles
一个更好的问题可能是“哪些是自动支持的?” - Joe Phillips
微软正在考虑废弃事务性NTFS。 请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx - Nathan
2个回答

13

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

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

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


2
FYI,微软正在考虑弃用Transactional NTFS。http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx - Nathan

6
不,您不能通过在TransactionScope内部运行代码来使任意代码具有事务性。
正如您在评论中指出的那样,System.Transactions命名空间提供了基础结构类以帮助使任何资源具有事务性。默认情况下,.NET为多种操作提供资源管理器支持,在您链接的命名空间介绍中列出了这些操作(在评论中):“SQL Server、ADO.NET、MSMQ和Microsoft Distributed Transaction Coordinator (MSDTC)”。
事实证明,文件系统事务有支持——尽管我只能找到它适用于NTFS(使用文件系统事务增强您的应用程序)。但是对于我来说,那段代码可能需要一个门面。也许还有其他更通用的实现(或者也许没有——使文件IO具有事务性可能需要NTFS提供的额外基础设施)。

目前有很多关于将内存状态变更事务化的研究,称为软件事务内存。微软DevLabs提供了一个实现:STM.NET


该项目似乎只支持在内存中处理事务状态。这与像我之前提到的System.IO一样支持使所有代码具有事务性相去甚远。TransactionScope除了数据库连接还支持什么? - jonathanpeppers
TransactionScope和Transactions是用于数据库的 - 它们还能用于别的什么? - user195488
这个页面提到了一些其他的东西:http://msdn.microsoft.com/en-us/library/system.transactions.aspx,它讨论了除了数据库(MSMQ)之外使用它的方法以及实现“资源管理器”的能力。那么,你能否实现一些使其他事务性的东西吗? - jonathanpeppers
我知道它们并不神奇,但事务性文件操作有多大用处呢?如果某些情况下可以想出“撤销”操作,那么这似乎是一个有效的开源项目。当然,您必须编写临时文件并执行重命名才能获得所需的效果。同样的想法也可以应用于其他方面(如UI中的CTRL+Z)。 - jonathanpeppers
@Jonathan,你说得对,STM只涉及内存中的状态,你可以实现资源管理器来使文件IO具有事务性(例如)。我已经更新了我的答案,以更好地适应你的问题(希望如此),并添加了一些额外的信息。 - Jeff Sternal
显示剩余2条评论

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