[ServiceContract]
public interface Iservice2
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateService2();
}
[ServiceContract]
public interface Iservice1
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void upload();
}
客户代码
using (var scope = new TransactionScope())
{
IserviceClient client = new Iservice1Client();
client.upload();
Iservice2 test = new Iservice2Client();
test.UpdateService2();
MessageBox.Show("All is well!!!");
scope.Complete();
}
我希望通过WCF详细了解2阶段或3阶段提交。
我理论上理解了2阶段提交的架构。
了解
问题
当WCF配置为PerCall时,分布式事务如何在WCF内部发生 - 它是否会暂时将状态保存到会话中,以便在调用实际提交时它可以提交?
州内的会议是否一直存在,直到交易完成为止? - 它是否保留了DB事务的引用?
当您收到并发请求时,WCF会保证2个请求会有2个不同的交易,并且不会将它们组合在一起 - 如果是这样,它如何知道它是2个不同的请求?
问题可能是基本问题,但我希望了解上述概念,为我的项目设计解决方案。
答案 0 :(得分:1)
您的问题包含大约6个问题。我将尝试一次解决一个问题。
我想通过WCF详细了解2阶段或3阶段提交。
WCF通过MSDTC使用WS-AtomicTransaction或OleTransaction来协调事务,这两个标准仅支持两阶段提交。
当WCF配置为PerCall时,分布式事务如何在WCF内部发生
您提出的问题可能只能由编写WCF的开发人员来回答。
会暂时将状态保存到会话中,以便在调用实际提交时提交
与您描述的过程类似的过程必须在逻辑上发生,但其工作方式的内部并不重要。它实际上工作 非常重要。这由该服务所在的机器上的资源管理器管理。来自msdn:
对于分布式事务,每台计算机都有一个本地事务 经理。当一个事务在多台计算机上工作时, 事务管理器通过与其他事务管理器交互 无论是上级还是下级关系。这些关系是 仅与特定交易相关。
那么各州的会议是否一直存在,直到交易完成为止? - 它是否保留了数据库交易的参考?
见上述问题的答案。
当您收到并发请求时,WCF会保证2个请求将有2个不同的交易并且不会将它们联合起来
最好。
如果是这样,它是如何知道它是2个不同的请求?
当请求进入时,将调度线程以服务该请求。如果WCF无法区分两个不同的传入请求,那么我不认为Microsoft会将其作为企业级Web服务平台发布。
我希望了解上述概念,为我的项目设计解决方案
也许您最好不要试图了解分布式事务如何在Windows上运行:
来自Pro WCF 4:实用的Microsoft SOA实现作者:Nishith Pathak:
两阶段提交协议允许所有节点参与 分布式事务以原子方式参与...(和)具有 三个阶段:活跃阶段,阶段1阶段和阶段2.在活跃阶段 交易已创建。优秀的资源管理器(资源 创建者的经理)征求其他资源经理的意见 在交易中变得活跃。在阶段1中,创建者发布 事务的commit命令和登记的资源管理器 回答他们是否准备承诺。如果经理是 准备提交,交易将转移到第2阶段,否则它 会中止。
在第2阶段,优秀的资源管理器将编写一个 持久进入内部日志,然后发出提交 入伍的资源管理者。一旦完成,优越的资源 经理将开始将提交发送到登记的资源 管理人员,无论有任何错误......都将持续到所有人 已登记的资源管理器已发送提交消息。那么 优秀的资源管理器将等待提交的确认 来自登记的资源管理器,出现错误消息,或者直到a 超时发生。是否所有入伍的资源管理者都应对 积极的提交,优秀的资源管理器将擦除 日志条目,交易将结束。