【问题标题】:Cross system transactions跨系统事务
【发布时间】:2013-10-04 09:51:27
【问题描述】:

我可能在这里使用了错误的术语(如果有人知道,我会喜欢正确的名称)但我经常遇到想要将某些内容保存到数据库+其他内容的问题。在我目前的情况下,我有以下代码。

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;
}

但是我已经多次遇到这个问题,我不禁觉得必须有更好的方法。那么,当您想在事务中对数据库执行某些操作 + 执行其他操作时,是否有一些适用的模式?

【问题讨论】:

    标签: c# .net design-patterns transactions windows-phone


    【解决方案1】:

    如果您将db.Commit(); 放在foreach 循环之前,那么Commit() 的任何错误都将在foreach 执行之前被捕获。只有当Commit() 成功时,foreach 循环才会运行。

    【讨论】:

    • 这很公平,但是当数据库插入工作正常并且您已经提交但独立存储保存失败时会发生什么?
    • 您正在回滚对 catch 块中数据库的更改,而您的 foreach 实质上是将更改回滚到 IsolatedStorage。我找不到更简单的方法,但我等待人们的回答
    • 您的文件存储组件会支持 TransactionScope 的概念吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多