如何"交易"IO操作和数据库执行?

Onl*_*ind 4 c# transactions

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

1- Create a file in a directory.
2- Set your own status to "Processed".
Run Code Online (Sandbox Code Playgroud)

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

  1- Create a file in a directory.
   -----SERVICE STOPPED-----
  2- Set your own status to "Processed".
Run Code Online (Sandbox Code Playgroud)

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

编辑 - 重要

问题是创建的文件是由另一个应用程序捕获的,因此只有在命令执行成功的情况下才需要真正创建文件.因为如果创建文件而另一个应用程序捕获了他,并且在发生数据库错误之后,问题将继续存在.

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

小智 5

您可以使用Transactional 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
        { }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅以下链接:

Codeplex上的TxF

Msdn参考

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