【问题标题】:Distributed two-steps transaction including EF and web service call分布式两步事务,包括 EF 和 Web 服务调用
【发布时间】:2017-09-29 17:39:12
【问题描述】:

我有一个“M”管理器(指挥)实例,它控制另外两个实例“A”和“B”。 “A”是 az Entity Framework 数据保护程序,“B”调用外部 Web 服务来做某事。 “M”的代码如下:

// code inside 'M'
void Save()
  B.Save()
  A.Save()

这是一种分布式事务。当 B.Save 丢弃异常时,A.Save 不应该发生或完成。现在我必须将其更改为运行良好。问题是,'M' 对 EF 事务如何工作或如何处理它一无所知,并且 A.Save 不能包含 B.Save 调用。所以我必须以某种方式将其更改为:

Object transaction = A.PrepareSave()
try {      
     B.Save() 
}
catch { 
     A.RollbackSave(transaction) 
     throw
}
A.FinishSave(transaction)

A.PrepareSave() 的样子(?)

TransactionScope scope = new TransactionScope()
var context = CreateContext()
... do something EF ...
context.SaveChanges(false)
return new MyCustomTuple(scope,context)

而 A.FinishShave(Object trans) 看起来像 (?)

MyCustomTuple tuple = (MyCustomTuple)trans
TransactionScope scope = (TransactionScope)tuple.Scope
EFContext context = (EFContext)tuple.Context
scope.Complete()
context.AcceptAllChanges()

问题1:可以吗?这是处理这种情况的方法吗? (我对 B.Save() 没有影响,它保存或丢弃异常)

问题2:最后如何释放资源(范围、上下文)? “M”管理器对 MyCustomTuple 及其内容一无所知。

【问题讨论】:

    标签: c# entity-framework transactions distributed


    【解决方案1】:

    您可以在 M 方法中直接使用TransactionScope,您不需要在代码的不同部分处理它。

    using (var transaction = new TransactionScope())
    {
      A.Save();
      B.Save();
      transaction.Complete();
    }
    

    如果两个保存方法都完成,这将完成,否则抛出异常,不调用Complete(),因此没有提交。 using 块将释放 TransactionScope。至于处理其他资源,你可以按照现在的方式进行。您没有为此提供任何示例(我希望创建上下文的组件(可能是组件 A)处理该上下文的处置),

    【讨论】:

    • 酷。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2019-01-02
    相关资源
    最近更新 更多