跨系统事务

本文关键字:事务 系统 | 更新日期: 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循环才会运行。