![](/img/trans.png)
[英]How to use one table for two different contexts in two different domains?
[英]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.