package cn.iocoder.yudao.module.mes.service.pro.bagcode; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 袋码/托盘分段写入器 *

* 每段使用独立事务(REQUIRES_NEW):几十万行放在同一个事务里会形成超大事务, * 长时间占用 undo/redo 与行锁,失败时回滚成本也极高。 *

* 独立成 Bean 是为了让 {@code REQUIRES_NEW} 经 Spring 代理生效,避免同类自调用绕过事务。 */ @Component public class MesProBagCodeChunkWriter { /** * 单条 INSERT 语句的行数;与分段大小分开,控制单条 SQL 的包体大小 */ private static final int INSERT_BATCH_SIZE = 1000; @Resource private MesProBagCodeMapper bagCodeMapper; @Resource private MesProPalletMapper palletMapper; /** * 写入一段袋码 */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void insertBagCodes(List bagCodes) { bagCodeMapper.insertBatch(bagCodes, INSERT_BATCH_SIZE); } /** * 写入一段托盘(插入后 ID 会回填到实体上) */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void insertPallets(List pallets) { palletMapper.insertBatch(pallets, INSERT_BATCH_SIZE); } }