U9C并行事务

  #region 生产订单
  /// <summary>
  /// 生产订单核准
  /// </summary>
  public override object Do(object obj)
  {
      var responses = new List<ResultDTOData>();
      var list = new List<Customer>();
      list.Add(new Customer()
      {
          Code = "ABC01"
      });
      list.Add(new Customer()
      {
          Code = "ABC02"
      });
      list.Add(new Customer()
      {
          Code = "ABC03"
      });

      // 进行委托调用
      using (UBFTransactionScope scope = new UBFTransactionScope(TransactionOption.RequiresNew))
      {
          try
          {
              InvokeHandler<ResultDTOData> invokeHandler = CreateCustomer;
              responses = ParallelHelper.Run<ResultDTOData, Customer>(invokeHandler, ParallelOption.InitBPContext | ParallelOption.ConcurrencyRetry, list);
              if (responses.Exists(p => p.Success == false))
              {
                  foreach (var item in responses)
                  {
                      if (item.Success)
                      {
                          item.Success = false;
                          item.Message = "其他数据有错,当前数据回滚!";
                      }
                  }
                  throw new Exception("有问题!");
              }
              scope.Commit();
          }
          catch (Exception e)
          {
              scope.Rollback();
          }
      }
      return responses.FirstOrDefault();
  }

  /// <summary>
  /// 并行运算
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  private ResultDTOData CreateCustomer(object obj)
  {
      var cc = obj as Customer; ;
      var response = new ResultDTOData();
      using (UBFTransactionScope scope = new UBFTransactionScope(TransactionOption.Required))
      {
          try
          {
              using (Session session = Session.Open())
              {
                  Thread.Sleep(5000); // 5秒,查看是否超过15秒
                  Customer customer = Customer.Create();
                  customer.Code = cc.Code;
                  customer.Name = cc.Code;
                  customer.Org = UFIDA.U9.Base.Context.LoginOrg;
                  customer.Effective = new UFIDA.U9.Base.PropertyTypes.Effective { IsEffective = true, EffectiveDate = DateTime.Today, DisableDate = new DateTime(2030, 1, 1) };
                  session.Commit();

                  if (cc.Code == "ABC03") {
                      Thread.Sleep(1000);
                      throw new Exception("主动测试报错");
                  }
              }
              scope.Commit();
              return new ResultDTOData
              {
                  Data = cc.Code,
                  Success = true
              };
          }
          catch (Exception e)
          {
              scope.Rollback();
              return new ResultDTOData
              {
                  Data = cc.Code,
                  Success = false,
                  Message = e.Message
              };
          }
      }
  }
  #endregion

 

posted @ 2025-08-04 19:00  江境纣州  阅读(9)  评论(0)    收藏  举报