求帮助:分表插入,事务回滚失效,插入数据依旧存在 返回
SqlSugar
沟通中
4
291
悬赏:0 飞吻
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 VIP0
2025/11/18MYSQL建表。。不支持事务。
0 回复 -
fate sta VIP0
2025/11/18这个没办法处理。 MYSQL create 的SQL 会自动提交事务
0 回复 -
fate sta VIP0
2025/11/18解决方案,一次性把几年的表都建好。这样就不会走建表方法了
0 回复 -
伤殚 VIP0
2025/11/18@fate sta:好的,谢谢
0 回复