数据库事务插入一部分成功,一部分失败,求解 返回

SqlSugar 沟通中
7 350
该叫什么 辻弌 发布于2周前
悬赏:100 飞吻
  1. 首先是对接接收


  2. public void StartConsuming()
    {
      _connection = rabbitMqFactory.CreateConnection();
      _channel = _connection.CreateModel();
      using (IConnection conn = rabbitMqFactory.CreateConnection())
      {
          using (IModel channel = conn.CreateModel())
          {
             channel.ExchangeDeclare(ExchangeName, "direct", durable: true, autoDelete: false, arguments: null);
             channel.QueueDeclare(QueueName, durable: true, autoDelete: false, exclusive: false, arguments: null);
             channel.QueueBind(QueueName, ExchangeName, routingKey: QueueName);
             var a = 0;
             // 声明交换机、队列和绑定(省略具体代码)
                   
            var consumer = new EventingBasicConsumer(_channel);
            consumer.Received += (model, ea) =>
            {
               // 处理消息(省略具体代码)
               var body = ea.Body.ToArray();
               var message = Encoding.UTF8.GetString(body);
               //假设您从消息中解析出一个数值
               var data = JsonConvert.DeserializeObject<GetPtlInfor>(message);
               //这里来调用方法
               PtlServerController ptlServerController = new PtlServerController();
               ptlServerController.MergeTaskInfor(data);
               //处理数值
               _channel.BasicAck(ea.DeliveryTag, multiple: false);
             };
    
             _channel.BasicConsume(queue: QueueName, noAck: false, consumer: consumer);
    }
  3. 然后demo部分
    public class PtlServerController : Controller
    {
        public PtlServerController()
        {
            var ger = System.Configuration.ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
            var _JCount = Convert.ToInt32(System.Configuration.ConfigurationManager.ConnectionStrings["JCount"].ConnectionString);
            JCount = _JCount;
            db = new SqlSugarClient(new ConnectionConfig()
            {
               ConnectionString = ger, // 替换为你的数据库连接字符串
               DbType = DbType.SqlServer, // 根据你的数据库类型进行替换
               IsAutoCloseConnection = true,
               InitKeyType = InitKeyType.Attribute, // 从特性读取主键和自增列信息
          });
       }
       //方法部分,这里是在控制器中的方法
       [HttpPost]
       public ActionResult MergeTaskInfor(GetPtlInfor getPtlInfor)
       {
           try
           {
               db.Ado.BeginTran();
               //添加合单后的主任务
               db.Insertable(lineMainTask).AS(LineBodyRepositoryInfor.LineMergedTask).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand();
               foreach (var item in list)
               {
                  item.Status = 1;
                  db.Updateable(item).AS(LineBodyRepositoryInfor.LineQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).Where(C => C.Id == item.Id).ExecuteCommand();
                  db.Updateable(item).IgnoreColumns(it => new { it.Id, it.StatusDesc, it.SetPull }).Where(c => c.pullNo == item.pullNo).ExecuteCommand();
               }                     
               db.Insertable(lineMainTaskInfors).AS(LineBodyRepositoryInfor.LineMainTaskInfor).IgnoreColumns(it => new { it.Id }).ExecuteCommand();
               db.Insertable(mainTaskInfors).AS(LineBodyRepositoryInfor.LineQuest).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand();
               var Gcount = 0;
               var GongInfor = 0;
                var date = DateTime.Now;
               //本在事务内,但出现事务提交成功,数据未保存,查询是                                
               foreach (var item in gongInfor)
               {
                 Quest quest = new Quest();
                 quest.MainTaskNumber = MainTaskName;
                 quest.FormerlyDate = date;
                 quest.WmarInfor = item.WorkshopName;
                 quest.Status = 0;
                 if (Gcount == 0)
                 {
                    quest.FormerlyWorkshopCode = "-1";
                    GongInfor = item.WorkshopSequence;
                 }
                 else
                 {
                    quest.FormerlyWorkshopCode = GongInfor.ToString();
                 }
                 GongInfor = item.WorkshopSequence;
                 //添加工段拣货信息                                                                                          
                 db.Insertable(quest).AS(item.WorkshopQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand();
    
                 Gcount++;                           
                 }
                 db.Ado.CommitTran();                                                           
                                                                    
                    }
            catch (Exception ex)
            {
                db.Ado.RollbackTran();
                 foreach (var item in list)
                {
                   TextLoggerInforGer.Append("出现异常合并子单号为:" + item.csnNo, "合并任务" + LineBodyRepositoryInfor.LineBodyName);
                  item.Status = 0;
                   db.Updateable(item).AS(LineBodyRepositoryInfor.LineQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).Where(C => C.Id == item.Id).ExecuteCommand();
                }
                TextLoggerInforGer.Append("合单出现异常,进行回滚,异常原因" + ex.Message + "," + ex.InnerException, "合并任务" + LineBodyRepositoryInfor.LineBodyName);
                return DataProcess.Failure("合单出现异常,进行回滚").ToMvcJson();
              }                              
               
              //因为有出现过事务执行完成,但是提交数据丢失情况,做了一次查询,用作记录
               foreach (var item in list)
              {
                 item.Status = 1;
                 db.Updateable(item).AS(LineBodyRepositoryInfor.LineQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).Where(C => C.Id == item.Id).ExecuteCommand();
                 var ger = db.Queryable<Linepull>().AS(LineBodyRepositoryInfor.LineQuestTable).Where(c => c.Id == item.Id).First();
                 if (ger != null)
                 {
                    TextLoggerInforGer.Append("最终执行完查询状态为:" + ger.csnNo + "状态:" + ger.Status, "合并任务" + LineBodyRepositoryInfor.LineBodyName);
                 }
              }
       }
            
    }

    这是关乎操作数据库的

  4. 但是在最终执行下来出现了死锁,但是我发现他是执行完成的,重启服务后我去查数据库,下面这句在每个表中又插入成功了,这个是为什么,其他的表都没有数据


  5. db.Insertable(quest).AS(item.WorkshopQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand();

    日志记录部分

    image.png

    请帮忙看下什么原因,也可以私聊看下,谢谢

热忱回答7

  • 1、线程安全引的并发问题解决方案

    var  newdb=db.CopyNew();

     try
       {

         newdb.Ado.BeginTran();


    将try里面的所有db都换成newdb进行测试


    2、如果是mysql保证表的引擎都是支持事务的。要一个一个确认

    0 回复
  • @fate sta:好的我试试,谢谢

    0 回复
  • @fate sta:我刚才看了下 db.不出来这个var  newdb=db.CopyNew();


    0 回复
  • @fate sta:咳咳没事了版本太低


    0 回复
  • @fate sta:我发现我版本.net 4.5没办法使用高版本的sqlSugar,没办法使用这个方法,还有其他方法可以吗


    0 回复
  • @辻弌:没办法用就手动new


    var newdb=new sqlsugarclient(xxx)

    0 回复
  • @fate sta:好的谢谢

    0 回复