[英]Cross system transactions
我在这里可能使用了错误的术语(如果有人知道,会喜欢使用专有名称),但是我经常遇到想要将某些内容保存到数据库中的问题。 在当前情况下,我有以下代码。
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块中的IsolatedStorage中删除所有图像,如下所示:
catch (Exception ex)
{
db.Rollback();
foreach (Stock item in stock)
IsolatedStorage.Delete(item.Name);
throw;
}
但是我已经多次遇到这个问题,我不禁感到必须有更好的方法。 那么,当您想对事务中的数据库做某事+做其他事情时,是否有适用的模式?
如果放置db.Commit();
在foreach
循环之前,那么将在执行foreach
之前捕获与Commit()
任何错误。 仅当Commit()
成功时, foreach
循环才会运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.