我可能在这里使用了错误的术语(如果有人知道它,我会喜欢它的正确名称)但我经常遇到想要将一些东西保存到数据库 + 其他东西的问题。在我当前的场景中,我有以下代码。
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。
现在,如果上面显示的代码失败,它显然会使 IsolatedStorage
处于不一致状态。我可以修改此代码并删除 catch block 中 IsolatedStorage 中的任何图像:
catch (Exception ex)
{
db.Rollback();
foreach (Stock item in stock)
IsolatedStorage.Delete(item.Name);
throw;
}
但是我遇到这个问题很多次了,我不禁觉得一定有更好的方法。那么,当您想在事务中对数据库执行某些操作 + 执行其他操作时,是否有一些适用的模式?
最佳答案
如果您将 db.Commit();
放在 foreach
循环之前,那么 Commit()
的任何错误都将被捕获 < strong>在 foreach
被执行之前。只有当 Commit()
成功时,foreach
循环才会运行。
关于c# - 跨系统交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19178296/