Python操作MariaDB生成唯一码重复触发大量回滚的优化咨询
唯一码生成入库高频回滚问题优化建议
1. 插入逻辑优化,避免整批回滚
- 把普通
INSERT语句替换为INSERT IGNORE:批量插入时遇到唯一键冲突只会跳过冲突行,不会触发整个事务回滚,改动成本极低,仅需修改SQL语句即可。修改后的插入语句如下:
INSERT IGNORE INTO BB_UNIQUE_CODE(unique_code, flag_code, get_id, barcode) VALUES (%s, %s, %s, %s)
- 插入完成后可通过
cursor.rowcount获取本次实际成功插入的行数,如果不满批次目标量,仅需补生成对应数量的新唯一码再次插入即可,无需整批重跑。 - 移除异常回滚逻辑中重置自增ID的操作:该操作完全不影响业务逻辑,还会加锁降低数据库性能,自增ID不连续不会对唯一码业务产生任何副作用。
2. 生成端预校验,减少冲突概率
- 每批次生成的唯一码先在内存中做一次去重,避免同一批次内就出现重复的无效码。
- 生成批次码后先批量查询数据库过滤已存在的码,从源头减少插入冲突,参考逻辑如下:
# 生成批次码后先去重 batch_codes = list({''.join(random.sample(FullChar, count)) for _ in range(total)}) # 批量查询已存在的码 placeholders = ','.join(['%s'] * len(batch_codes)) cursor.execute(f"SELECT unique_code FROM BB_UNIQUE_CODE WHERE unique_code IN ({placeholders})", batch_codes) exists_codes = {item[0] for item in cursor.fetchall()} # 过滤得到有效待插入条目 valid_entries = [(code, flg_id, get_id, bcd) for code in batch_codes if code not in exists_codes]
3. 唯一码生成规则优化,从根源降低冲突概率
当前你使用的7位字符总组合数为19^7=893,871,739,3000万存量已经占用了约3.3%的组合空间,按照生日悖论,后续冲突概率会快速上升,可选择两种优化方向:
- 增加唯一码长度:比如调整为8位,总组合数提升至19^8=16,983,563,041,冲突概率会指数级下降。
- 改用离线预生成码池:提前离线生成一批无重复的唯一码存入待消费池,业务需要时直接从池里取码使用,完全避免运行时生成的冲突问题,插入性能也会大幅提升。
4. 数据库层面优化
- 确认
unique_code字段已经设置了唯一索引,这是去重的基础,同时索引也能大幅提升批量查询判断码是否存在的效率。 - 可根据实际性能表现调整批次大小,比如从20调整到50-100,减少事务提交次数,同时避免单批次过大导致冲突概率过高。
内容的提问来源于stack exchange,提问作者here
相关产品推荐
相关产品推荐

