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支持将文件数据流作为事务的一部分 见: 对于非常大的文件,我不建议这样做,因为当您同时有很多事务时,您通常希望事务尽可能快 我通常会使用补偿行为,例如,将状态存储在数据库中,当服务重新启动时,让它首先检查已启动但未完成的操作,然后完成它们
你自己写这项服务?你在哪里工作?数据库与您的代码有什么关系?是的,我在写,
在顶部
不是一个好方法,因为计算机可能会突然停止。您可以使用三向标志,例如:停止
处理
处理
。这样,每次启动服务时,您都会将标志设置为处理
。如果服务突然停止,您会知道的。您的意思是,您想使用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.