有个需求需要定时接收数据,然后插入或更新到数据库。
代码如下:
//业务方法
void InsertLog(string gameId, string sellerName, string buyerName, string orderId, string orderTime, string orderLog)LogBll.CreatInStance().SaveLogInfo(logInfo, orderInfo, updateOrderType, isOperatorOrder, orderJobInfo); //调用保存数据方法///保存数据
 public int AddObjects(LogInfo logInfo, OrderInfo orderInfo, UpdateOrderType updateOrderType, bool isOperatorOrder, OrderJobInfo orderJobInfo)
        {
           OrderInfo oldOrderInfo = Logistics.Data.Common.IOC.CommonService.OrderService.GetOrderInfo(orderInfo.OrderId);
            if (oldOrderInfo == null)
            {
                Context.OrderInfo.Add(orderInfo);
            }
            else if (oldOrderInfo.OrderState != orderInfo.OrderState)
            {
                Context.OrderInfo.Attach(orderInfo);
                Context.Entry(orderInfo).State = EntityState.Modified;
            }
            if (isOperatorOrder) Context.OrderJobInfo.Add(orderJobInfo);
            LogInfo log = Logistics.Data.Common.IOC.CommonService.LogService.GetLogInfo(logInfo.Id);
            if (log == null)
                Context.LogInfo.Add(logInfo);
            return Context.SaveChanges();
        }

解决方案 »

  1.   

      System.Threading.Thread aThread1 = new Thread(new ThreadStart(Test));
                System.Threading.Thread aThread2 = new Thread(new ThreadStart(Test));
                aThread1.Start();
                aThread2.Start();public void Test()
            {
                var gameId = "f44eb447e7e049c38eb13dc962f72a68";
                var sellerName = "冰";
                var buyerName = "test11";
                var orderNo = DateTime.Now.ToString("yyyyMMddHHmmssff");
                var orderTime = DateTime.Now.ToString();
                var orderLog = "0";            for (int i = 1; i < 15; i++)
                {
                    if (i == 13) orderLog = "400";
                    else if (i == 14) orderLog = "500";
                    else orderLog = (Convert.ToInt32(orderLog) + 10).ToString();
                    orderTime = DateTime.Now.AddHours(1).AddMinutes(1).AddSeconds(1).AddMilliseconds(1).ToString();
                    Logistics.Data.ReceiveData.HandlerLog handlerLog = new HandlerLog();
                    handlerLog.InsertLog(gameId, sellerName, buyerName, orderNo, orderTime, orderLog);
                }
            }上面的方法 单线程操作一点问题都没有。 但如果aThread1 aThread2 都运行就出现如下问题:
    1.如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
    2.违反了 PRIMARY KEY 约束 'PK_OrderInfo'。不能在对象 'dbo.OrderInfo' 中插入重复键。求大虾们指导,求解决方案
      

  2.   

    1、事务是否是在循环内声明的。如是的话应修改。
    2、弄清楚约束 'PK_OrderInfo'这个约束是对应的什么字段。然后用公共变量来解决这个问题。