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