如何编写一个事务来覆盖移动文件和在数据库中插入记录?

Ray*_*phy 18 c# asp.net

我想要一个事务来复制文件,然后在数据库中插入一个记录.像下面的语句,但事务不包括复制文件.解决方案是什么?

using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Move(srcFileName, destFileName);

    // Insert a database record
    dbMgr.ExecuteNonQuery(insertSql);

    scope1.Complete();
}
Run Code Online (Sandbox Code Playgroud)

Dam*_*ith 19

尝试使用.NET Transactional文件管理器

此库允许您在以下事务中包装文件系统操作:

// Wrap a file copy and a database insert in the same transaction
TxFileManager fileMgr = new TxFileManager();
using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Copy(srcFileName, destFileName);

    // Insert a database record
    dbMgr.ExecuteNonQuery(insertSql);

    scope1.Complete();
} 
Run Code Online (Sandbox Code Playgroud)

  • 这个库**不是Transactional NTFS的包装器.它只是实现了`IEnlistmentNotification`并允许手动标准文件操作与`TransactionScope`一起使用.例如,要为现有文件上的写入操作启用回滚,它首先创建将要写入的文件的备份,然后写入备份文件,最后如果事务处理则使用备份/修改的文件替换初始文件如果事务被回滚,则提交或删除备份文件.这与**Transactional NTFS无关. (16认同)
  • 我对此很谨慎,因为更新很少,但看到TxF不在菜单上(参见我对xanatos的评论),这似乎是最好的解决方案(对我来说). (2认同)

xan*_*tos 5

较新版本的Windows具有可以使用的称为TxF(事务性NTFS)的东西.这里有一个代码示例:WINDOWS VISTA - 在C#中引入TXF(第2部分) - 使用SYSTEM.TRANSACTIONS和DTC(我很抱歉大写锁定,但页面的标题是:-))

你必须使用MoveFileTransacted而不是DeleteFileTransactioned.一旦你进入DTC,你的SQL连接应该注册到它,所以一切都应该是一个大的事务.

  • MS警告不要使用TxF,因为它可能会从未来的操作系统中移除:http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690(v = vs.85).aspx.某些TxF功能已在Windows 8中弃用:http://xpwasmyidea.blogspot.co.uk/2011/09/features-removed-in-windows-8.html (3认同)