簡體   English   中英

如何在不同環境下使用交易?

[英]How to use transactions for different contexts?

在我的應用程序中,我的方法如下所示:

public static bool DoLargeOperation()
{
    bool res = true;

    res = res && DoFirstSubOperation();
    res = res && DoSecondSubOperation();
    res = res && DoThirdSubOperation();

    return res;
}

每個內部方法如下所示:

public static bool DoFirstSubOperation()
{
    using (var context = new EntityFrameworkContext())
    {
        // data modification.
        context.SaveChanges();
    }
}

例如, DoFirstSubOperation()DoSecondSubOperation()成功完成,但是DoThirdSubOperation()失敗。 如何回滾前兩個功能所做的更改?

這種方法沒有帶來結果:

using (var transaction = new TransactionScope())
{
    res = res && DoFirstSubOperation();
    res = res && DoSecondSubOperation();
    res = res && DoThirdSubOperation();
}

我看到的唯一解決方案是像這樣定義上下文:

public static bool DoLargeOperation()
{
    bool res = true;

    using (var context = new EntityFrameworkContext())
    {
        using (var transaction = context.Database.BeginTransaction())
        {

            res = res && DoFirstSubOperation(context);
            res = res && DoSecondSubOperation(context);
            res = res && DoThirdSubOperation(context);
            if (res)
            {
                transaction.Commit();
            }
            else
            {
                transaction.Rollback();
            }
        }
    }

    return res;
}

但是這樣做可以接受嗎? 還是有其他解決方案?

是的,那是正確的模式。 將上下文傳遞到方法中允許方法在多個位置重用,因為上下文和事務將由調用方管理。

但是,一旦第一個方法失敗,您可能希望停止處理后續方法。 您可能還希望將對子級的調用包裝在try / catch中,以便任何異常都可以正確進行回滾...

try
{
    res = DoFirstSubOperation(context);
    if (res) 
        res = DoSecondSubOperation(context);
    if (res) 
        res = DoThirdSubOperation(context);    

    if (res)
        transaction.Commit();
    else
        transaction.Rollback();
}
catch
{
    transaction.Rollback();
}

如果您的子方法已經處理異常,則可以放棄try / catch。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM