如何实现非数据库操作的类似事务的行为
本文关键字:事务 操作 数据库 何实现 实现 | 更新日期: 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
...
此表表示应删除的文件列表。我想做的是:
- 删除位于"位置"的特定文件;
-
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;
}
}