我的服务包含运行的处理器,它做了两件事:
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#开发。
答案 0 :(得分: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
{ }
}
}
有关详细信息,请参阅以下链接:
注意:记住DTC会带来严重的性能损失。
答案 1 :(得分:1)
您没有指定数据库服务器,但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.
对于非常大的文件,我不推荐它,因为当你有大量的同步交易时,你经常希望交易尽可能快。
我通常使用补偿行为,例如在数据库中存储状态,并在重新启动服务时,首先检查已启动但尚未完成的操作并完成它们。