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

时间:2013-12-05 14:07:55

标签: 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. 删除位于“location”的特定文件;
  2. DELETE上表中的文件记录。
  3. 像这样:

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

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

    • 请注意DeleteFile()由不同的实现备份,具体取决于 文件位置(例如filesystem vs ftp),所以不是简单的 例如用于删除的File.Delete()
    • 这是必须解决的事情 ad hoc (我宁愿不实现我自己的全面交易)或者是否有一些像TransactionScope一样简单易用的东西数据库查询?

1 个答案:

答案 0 :(得分:4)

尝试此操作(切换删除数据库和删除文件的顺序,以便只有在成功进行数据库事务后才删除文件):

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

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

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