c# - 跨系统交易

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

我可能在这里使用了错误的术语(如果有人知道它,我会喜欢它的正确名称)但我经常遇到想要将一些东西保存到数据库 + 其他东西的问题。在我当前的场景中,我有以下代码。

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/

相关文章:

c# - 是否可以在 gridview 的单元格中滚动?

c# - WPF MVVM ListBox.ItemTemplate CheckBox IsChecked 绑定(bind)

javascript - Jquery 不良做法

design-patterns - 如何构建用函数式语言编写的应用程序?

php - 根据子类在父类中包含类

c# - 如何在 WCF 服务和宿主应用程序之间进行通信?

C#检查数据库中是否存在表

c# - MS Word 插件,添加一个按钮,右键单击所选文本会弹出

.net - windbg/sos : Finding which class has static reference to object

.net - 使参数化查询同时适用于 SQL Server 和 Oracle