跨系统事务
本文关键字:事务 系统 | 更新日期: 2023-09-27 18:33:48
我可能在这里使用了错误的术语(如果有人知道,我会喜欢正确的名称),但我经常遇到想要将某些内容保存到数据库+其他内容的问题。在我当前的方案中,我有以下代码。
public class Stock
{
public Guid StockID { get; set; }
public string Name { get; set; }
public byte[] Image { get; set; }
}
IEnumerable<Stock> stock = new StockService().Get();
using (Database db = DBFactory.Create())
{
try
{
db.BeginTransaction();
db.InsertAll(stock);
foreach (Stock item in stock)
IsolatedStorage.SaveFile(item.Name, item.Image);
db.Commit();
}
catch
{
db.Rollback();
throw;
}
}
正如你所希望的那样,我正在做的是将一些东西保存到数据库(在我的例子中是Sqlite)和Windows Phone设备上的隔离存储中。
现在,如果如上所示的代码失败,它显然会使IsolatedStorage
处于不一致状态。我可以修改此代码并从 catch 块中的隔离存储中删除任何图像,如下所示:
catch (Exception ex)
{
db.Rollback();
foreach (Stock item in stock)
IsolatedStorage.Delete(item.Name);
throw;
}
但是我已经遇到过这个问题很多次了,我不禁觉得一定有更好的方法。那么,当您想在事务中对数据库执行某些操作 + 执行其他操作时,是否有一些模式适用?
如果您将db.Commit();
放在foreach
循环之前,那么Commit()
的任何错误都将在执行foreach
之前被捕获。只有当Commit()
成功时,foreach
循环才会运行。