确保2个方法成功,否则回滚

时间:2013-09-12 21:29:59

标签: c# transactionscope

任何人都可以告诉我这是否可行。

我有一些允许用户上传/更改图像的代码,在更改发生之前我会在上传新图像之前从磁盘中删除默认/旧图像。

问题是如果删除或上传出现问题,我如何回滚两者以便返回原始图像。

我以为我可以使用tranactionscope,但要么我没有正确使用它,要么就不适用于这种情况。

我发现的所有示例都涉及使用2次调用数据库,但我的代码只涉及一次调用而且需要更新。

//TODO check transactionscope works ok
using (var tran = new TransactionScope())
{
    //Delete old image before updating new image
    //123 bogus number to throw error
    var deleteOldImage = _igmpfu.DisplayProfileDetailsForUpdate("123")
                                .FirstOrDefault();

    if (Convert.ToString(deleteOldImage) != 
        "5bb188f0-2508-4cbd-b83d-9a5fe5914a1b.png")
    {
        DeleteOldImage(deleteOldImage);
    }

    //Insert new image
    var imageGuid = imageId + ".png";
    bool imageUrl = _iuma.UpdateAvatar(cookieId, imageGuid);

    if (imageUrl)
    {
        TempData["Message"] = "Image updated";
        return RedirectToAction("Index", "Members");
    }
    tran.Complete();
}

任何帮助新手的帮助都会受到赞赏

// ------------------------

我一直在看电脑,我所要做的只是

var deleteOldImage = _igmpfu.DisplayProfileDetailsForUpdate("123").FirstOrDefault();
                        if (deleteOldImage != null)
                        {

                           code here for writing to disk
                        }

我花了很多时间尝试解决这个问题,而这就是我必须做的事情: - (

感谢大家的回复。

1 个答案:

答案 0 :(得分:0)

只有当您使用的课​​程知道如何在交易中登记时,您所拥有的代码才有效。

处理文件时遇到的主要问题是文件系统很难以事务方式处理。我将使用的方法是:

  1. 使用不同的文件名将新文件保存在磁盘上。
  2. 使用新文件名更新数据库。
  3. 如果db update成功,请从磁盘中删除旧文件,如果没有从磁盘中删除新文件。