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