c# - 如何为非数据库操作实现类似事务的行为?

标签 c# .net transactions

假设我有一个数据库表,其中包含 <fileID><location> 形式的文件路径/URL 列表。 ,例如:

fileID  location
----------------------------------
0       C:\Folder\Sub\file1.txt
1       \\path\Folder\file2.txt
2       ftp://someftp/file3.txt
...

此表表示应删除的文件列表。我想做的是:

  1. 删除位于“位置”的特定文件;
  2. DELETE上表中的文件记录。

像这样:

MyClass.DeleteFile(fileId);             // statement 1
DELETE FROM table WHERE fileId=@fileId  // statement 2

问题如果DeleteFile()成功但是 DELETE查询失败,我想取消删除刚刚删除的文件。确保两个语句都成功或都不成功的最佳方法是什么? IE。我想将它们包含在事务中,但显然这不是数据库 事务。

  • 请注意 DeleteFile()由不同的实现支持,具体取决于 文件位置(例如文件系统与 ftp),所以它不仅仅是 例如一个File.Delete()用于删除。
  • 这是必须临时解决的问题吗(我宁愿不实现我自己的完全成熟的交易性),还是有像 TransactionScope 这样简单易用的东西?用于数据库查询?

最佳答案

试试这个(切换从数据库中删除和文件删除的顺序,以便只有在数据库事务成功后才删除文件):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {

        ...Delete File From DB Code...  // statement 2
        MyClass.DeleteFile(fileId);             // statement 1

        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

关于c# - 如何为非数据库操作实现类似事务的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20402141/

相关文章:

c# - iTunes SDK : Loading shared music

c# - 将链接标签添加到绑定(bind)到 DataSet 的 DataGridView 单元格或列

firebase云功能事务偶尔工作

c# - 如何最好地使用 C#/LINQ 计算派生货币汇率转换?

C# metro - 后台任务刷新不到 15 分钟

c# - 运行时不显示图像 C# WPF

c# - 如何使用 C# 访问 iOS App 的文档文件夹

c# - Func<T, bool> 和 Predicate<T> 编译后不是一回事吗?

c# - 事务不在 C# 中回滚

sql - SQL Server 事务中的 Finally 子句?无论成功或失败都会执行的东西?