求帮助:分表插入,事务回滚失效,插入数据依旧存在 返回

SqlSugar 沟通中
4 291
  static void ExecuteTaskNew(object state)
  {

      Console.WriteLine("开始执行->order_lists分表任务: " + DateTime.Now);

      const int batchSize = 1000;
      const int maxBatches = 100;
      int totalProcessed = 0;


      var sm = new BLL_System_RO();
      var groupkey = sm.Db.Queryable<system_site>().Where(x => x.status > -1).Select(x => new { x.siteid, x.groupcode }).ToList();

      try
      {
          var endTime = DateTime.Now.AddMonths(-2);

          
          var mpOld = new ZK_Web_APP_DBL.BLL.DbContext(db_1);

          var mpNew = new ZK_Web_APP_NEW_DBL.BLL.DbContext(db_2);

          for (int batch = 0; batch < maxBatches; batch++)
          {
              // 分页查询原始数据
              var sourceData = mpOld.Db.Queryable<order_lists>()
                  .Where(x => x.create_date < endTime)
                  .OrderBy(x => x.orderid)
                  .Skip(batch * batchSize)
                  .Take(batchSize)
                  .ToList();

              if (sourceData.Count == 0) break;

              // 转换到分表实体
              var subMeterData = sourceData.Select(x => new ZK_Web_APP_NEW_DBL.Models.order_lists_submeter
              {
                  order_lists_submeter_ulid = Ulid.NewUlid().ToString(), // 生成ULID
                  groupkey = groupkey.FirstOrDefault(y => y.siteid == x.siteid)?.groupcode,
                  // 基础字段
                  orderid = x.orderid,
                

              }).ToList();


              int insert_count = 0;

              try
              {
                  mpNew.Db.BeginTran();
                  // 批量插入分表
                  insert_count = mpNew.Db.Insertable(subMeterData).SplitTable().ExecuteCommand();

                  throw new Exception("测试异常");

                  mpNew.Db.CommitTran();
                  Console.WriteLine($"已插入 {insert_count} 条数据");
              }
              catch (Exception ex)
              {

                  mpNew.Db.RollbackTran();
                  Console.WriteLine($"插入失败: {ex.Message},{ex.StackTrace}");
                  break;

              }



              totalProcessed += sourceData.Count;

              // 验证插入数量
              if (insert_count != 0 && insert_count == subMeterData.Count)
              {
                  //删除旧数据(可选)
                  //var deleteIds = sourceData.Select(x => x.orderid).ToList();
                  //mpOld.Deleteable<order_lists>()
                  //    .Where(x => deleteIds.Contains(x.orderid))
                  //    .ExecuteCommand();


                  //Console.WriteLine($"已删除 {deleteIds.Count} 条旧数据");
              }



              // 间隔控制
              Thread.Sleep(1000);

              if (totalProcessed >= maxBatches * batchSize)
                  break;
          }

          Console.WriteLine($"已完成迁移 {totalProcessed} 条数据");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"迁移失败: {ex.Message}");
      }
  }

order_lists_submeter是一个分表,插入到新建的分表,执行完 mpNew.Db.RollbackTran();发现数据库里面的order_lists_submeter分表里面还是有记录。用的是mysql,表引擎是InnoDB,

热忱回答4

  • fate sta fate sta VIP0
    2025/11/18

    MYSQL建表。。不支持事务。

    0 回复
  • fate sta fate sta VIP0
    2025/11/18

    这个没办法处理。 MYSQL create 的SQL 会自动提交事务

    0 回复
  • fate sta fate sta VIP0
    2025/11/18

    解决方案,一次性把几年的表都建好。这样就不会走建表方法了

    0 回复
  • 伤殚 伤殚 VIP0
    2025/11/18

    @fate sta:好的,谢谢

    0 回复