【发布时间】:2021-06-23 08:02:36
【问题描述】:
我正在尝试理解以下文档:
我发现文档难以阅读和理解,特别是它给人一种在应用程序级别支持事务的错误感觉。让我们考虑以下 SO 参考,其中发布者请求在事务中支持 File.Move:
截至今天,接受的答案是(截断):
TxFileManager fileMgr = new TxFileManager();
using (TransactionScope scope1 = new TransactionScope())
{
fileMgr.Copy(srcFileName, destFileName);
scope1.Complete();
}
突出的第一件事是接受的答案稍微修改了原始发帖人的请求,在那个答案更改的行中:
fileMgr.Move(srcFileName, destFileName);
进入:
fileMgr.Copy(srcFileName, destFileName);
重要的一点是底层系统(实际的文件系统)可能不提供原子File.Move 操作(例如,显然在跨越文件系统边界时)。
我应该如何阅读上述文档以了解实施资源管理器时的实际要求是什么?特别是当底层系统不提供true原子操作(我们可以以跨越文件系统边界的File.Move操作为例)时,是否可以实现资源管理器?
【问题讨论】:
-
当然你可以实现一个没有任何底层事务文件系统的RM。这正是大多数数据库系统(如 SQL Server)所做的,它们不依赖于任何其他东西,只依赖于它们的代码。但这并不意味着成就自己是一项简单的工作。在 Windows 上,最简单的方法是使用 Compensating Resource Manager 重用 DTC 基础结构:docs.microsoft.com/en-us/windows/win32/cossdk/…
标签: c# transactions filesystems atomic