/// <summary> /// 参加指定标识的分布式事务,直到事务执行完成。一个分布式事务包含若干本地事务 /// </summary> /// <param name="identity">标识一个分布式事务</param> /// <returns></returns> public bool AttendTransaction(string identity) { DistTransInfo info = new DistTransInfo(); info.ClientIdentity = base.CurrentContext.Request.ClientIdentity; info.CurrentDTCState = DistTrans3PCState.CanCommit; info.LastStateTime = DateTime.Now; info.TransIdentity = identity; //DTResourceList.Add(info); DateTime dtcStart = DateTime.Now; //获取一个当前事务标识的协调器线程 DTController controller = DTController.CheckStartController(identity); CurrentDTCState = DistTrans3PCState.CanCommit; while (CurrentDTCState != DistTrans3PCState.Completed) { //获取资源服务器的事务状态,资源服务器可能自身或者因为网络情况出错 if (!SendDTCState(info, controller, identity)) { break; } } SendDTCState(info, controller, identity); DTController.RemoveController(identity); Console.WriteLine("DTC Current Use time:{0}(s)", DateTime.Now.Subtract(dtcStart).TotalSeconds); return(true); }
private bool SendDTCState(DistTransInfo info, DTController controller, string identity) { string clientIdentity = string.Format("[{0}:{1}-{2}]", base.CurrentContext.Request.ClientIP, base.CurrentContext.Request.ClientPort, base.CurrentContext.Request.ClientIdentity); try { Console.WriteLine("DTC Service Callback {0} Message:{1}", clientIdentity, CurrentDTCState); info.CurrentDTCState = base.CurrentContext.CallBackFunction <DistTrans3PCState, DistTrans3PCState>(CurrentDTCState); info.LastStateTime = DateTime.Now; CurrentDTCState = controller.GetDTCState(info.CurrentDTCState); return(true); } catch (Exception ex) { Console.WriteLine("DTC Service Callback {0} Error:{1}", clientIdentity, ex.Message); return(false); } }