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

本文关键字:事务 操作 数据库 何实现 实现 | 更新日期: 2024-07-27 19:58:01

>假设我有一个数据库表,其中包含<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查询失败,我想取消删除刚刚删除的文件。确保两个语句都成功或都不成功的最佳方法是什么?即我想将它们放在事务中,但显然这不是数据库事务。

  • 请注意,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;
    }
}