【发布时间】: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