如何"transaction"一个IO操作和一个数据库执行?

How to "transaction" a IO operation and a database execution?

我有一个包含处理器 运行 的服务,它做两件事:

1- Create a file in a directory.
2- Set your own status to "Processed".

但是,当服务恰好在处理过程中停止时,文件会在目录中创建,但是过程尚未完成,如下所示:

  1- Create a file in a directory.
   -----SERVICE STOPPED-----
  2- Set your own status to "Processed".

我需要一种方法来使用数据库命令处理 IO 操作,该怎么做?

编辑 - 重要

问题是创建的文件被其他应用捕获,所以只有命令执行成功才需要真正创建文件。因为如果这个文件被创建,另一个应用程序捕获他,并且发生数据库错误后,问题将继续。

OBS:我正在使用c#开发。

您可以使用事务性 NTFS (TxF)。这为文件操作提供了执行完全原子的、一致的、隔离的和持久的操作的能力。

它可以与大量其他交易技术结合使用。因为 TxF 使用了新的内核事务管理器 (KTM) 功能,并且因为新的 KTM 可以直接与 Microsoft® 分布式事务处理协调器 (DTC) 一起工作。

任何可以将 DTC 作为事务协调器使用的技术都可以在单个事务中使用事务文件操作。这意味着您现在可以在与 SQL 操作、通过 WS-AtomicTransaction 的 Web 服务调用、通过 OleTransactionProtocol 的 Windows Communication Foundation 服务,甚至是事务性 MSMQ 操作相同的事务中登记事务处理文件操作。

文件和数据库原子事务示例:

using (connectionDb)
{
    connectionDb.Open();
    using (var ts = new System.Transactions.TransactionScope())
    {
        try
        {
            File.Copy(sourceFileName, destFileName, overwrite);
            connectionDb.ExecuteNonQuery();
            ts.Complete();
        }
        catch (Exception)
        {
            throw;
        }
        finally
        { }
    }
}

有关详细信息,请参阅以下链接:

TxF on Codeplex

Msdn reference

注意:请记住 DTC 会带来严重的性能损失。

您没有指定数据库服务器,但 Microsoft SQL Server 2008 R2 支持将流文件数据作为事务的一部分。

参见:https://technet.microsoft.com/en-us/library/bb933993%28v=sql.105%29.aspx

Transactional Durability
With FILESTREAM, upon transaction commit, the Database Engine ensures transaction durability for FILESTREAM BLOB data that is modified from the file system streaming access.

对于非常大的文件,我不会推荐它,因为当您有很多并发事务时,您通常希望事务尽可能快。

我通常会使用补偿行为,例如将状态存储在数据库中,当服务重新启动时,让它首先检查已经开始但未完成的操作并完成它们。

  1. 操作于日期时间 y 在服务器 x 上开始
  2. 操作在日期时间 y 在服务器 x 上完成