Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何";“交易”;IO操作和数据库执行?_C#_Transactions - Fatal编程技术网

C# 如何";“交易”;IO操作和数据库执行?

C# 如何";“交易”;IO操作和数据库执行?,c#,transactions,C#,Transactions,我有一个包含正在运行的处理器的服务,它可以做两件事: 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". 我

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

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-AddiICTraseWeb服务调用,通过OutTraceActoNo规程的Windows通信基础服务,甚至事务性MSMQ操作。p> 文件和数据库原子事务的示例:

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
        { }
    }
}
有关详细信息,请参阅以下链接:


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

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

见:

对于非常大的文件,我不建议这样做,因为当您同时有很多事务时,您通常希望事务尽可能快

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

  • 操作在日期时间y在服务器x上启动
  • 在日期时间y在服务器x上完成的操作

  • 你自己写这项服务?你在哪里工作?数据库与您的代码有什么关系?是的,我在写,
    在顶部
    不是一个好方法,因为计算机可能会突然停止。您可以使用三向标志,例如:
    停止
    处理
    处理
    。这样,每次启动服务时,您都会将标志设置为
    处理
    。如果服务突然停止,您会知道的。您的意思是,您想使用BeginTransaction、Commit和Rollback,或者创建为您的服务执行“类似”操作的方法?@Only好奇为什么要创建文件?为什么不使用数据库本身呢?数据库提供了MVCC事务来很好地处理这个场景。您希望您的操作符合ACID,那么您必须为您的操作实现适当的MVCC事务策略,或者使用现有的策略,这里数据库本身提供一切。与其用其他程序来监视文件,何不监视数据库,否则,最简单的方法将是使用两步写入,首先写入临时文件,验证数据库并重命名文件。我现在没有时间来测试这种方法,但从我读到的内容来看似乎是可行的。谢谢你的回答。谢谢你的回答,但是,我需要使用一种适用于许多数据库的方法,例如sql server、Oracle和Informix。然而,这是我不知道的sql server的一个特性+1.
    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.