如何"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
{ }
}
}
有关详细信息,请参阅以下链接:
注意:请记住 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.
对于非常大的文件,我不会推荐它,因为当您有很多并发事务时,您通常希望事务尽可能快。
我通常会使用补偿行为,例如将状态存储在数据库中,当服务重新启动时,让它首先检查已经开始但未完成的操作并完成它们。
- 操作于日期时间 y 在服务器 x 上开始
- 操作在日期时间 y 在服务器 x 上完成
我有一个包含处理器 运行 的服务,它做两件事:
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
{ }
}
}
有关详细信息,请参阅以下链接:
注意:请记住 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.
对于非常大的文件,我不会推荐它,因为当您有很多并发事务时,您通常希望事务尽可能快。
我通常会使用补偿行为,例如将状态存储在数据库中,当服务重新启动时,让它首先检查已经开始但未完成的操作并完成它们。
- 操作于日期时间 y 在服务器 x 上开始
- 操作在日期时间 y 在服务器 x 上完成