如何编写一个事务,以涵盖在数据库中移动文件和插入记录

本文关键字:数据库 移动 文件 记录 插入 何编写 事务 一个 | 更新日期: 2023-09-27 18:12:49

我想有一个事务复制一个文件,然后在数据库中插入一个记录。类似下面的语句,但事务不包括复制文件。解决办法是什么?

using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Move(srcFileName, destFileName);
    // Insert a database record
    dbMgr.ExecuteNonQuery(insertSql);
    scope1.Complete();
}

如何编写一个事务,以涵盖在数据库中移动文件和插入记录

尝试使用。net事务文件管理器

这个库允许您像这样将文件系统操作包装在事务中:

// 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();
} 

新版本的Windows可以使用TxF (Transactional NTFS)。这里有一个代码示例:WINDOWS VISTA -在c#中引入TXF(第二部分)-使用系统。交易和DTC(很抱歉大写锁定,但页面标题是:-))

你必须使用MoveFileTransacted而不是DeleteFileTransactioned。一旦您在DTC中,您的SQL连接应该被注册到其中,因此所有事情都应该是一个大事务。

请在使用transactional NTFS或任何其他建议之前阅读本文:https://learn.microsoft.com/nl-nl/windows/desktop/FileIO/deprecation-of-txf

TxF是一组复杂而微妙的api,不常被第三方应用程序使用。考虑到这些api可能在Windows的未来版本中不可用,以及有更简单的替代方法来实现TxF开发的许多场景,微软强烈建议开发人员研究这些替代方法,而不是在他们的应用程序中创建对TxF的依赖。

实现ACID的更好方法是使用fileststream存储

您可以手动滚入自己的文件事务,如果提交失败,则将文件移回原始位置

using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Move(srcFileName, destFileName);
    try
    {
        // Insert a database record
        dbMgr.ExecuteNonQuery(insertSql);
        scope1.Complete();
    } catch (Exception) {
        fileMgr.Move(destFileName, srcFileName);
    }
}

我不是100%确定在提交事务时是否发生错误的语法,但我认为这说明了

的概念