假设我有一个数据库表,其中包含<fileID><location>
形式的文件路径/ URL列表,例如:
fileID location
----------------------------------
0 C:\Folder\Sub\file1.txt
1 \\path\Folder\file2.txt
2 ftp://someftp/file3.txt
...
此表表示应删除的文件列表。我想做的是:
DELETE
上表中的文件记录。像这样:
MyClass.DeleteFile(fileId); // statement 1
DELETE FROM table WHERE fileId=@fileId // statement 2
问题:如果DeleteFile()
成功但DELETE
查询失败,我想取消删除刚刚删除的文件。确保两个语句都成功,或者没有一个的最佳方法是什么?即我希望在事务中使用它们,但显然这不是数据库事务。
DeleteFile()
由不同的实现备份,具体取决于
文件位置(例如filesystem vs ftp),所以不是简单的
例如用于删除的File.Delete()
。TransactionScope
一样简单易用的东西数据库查询?答案 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;
}
}