Spring注解@Transactional事务使用问题

同步数据需要分批操作,每次同步1000条,都需要提交事务

@Service
public class MyService {

    @Autowired
    private MyService self; // 注意使用自身代理对象来触发事务

    // 循环调用此方法
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertData(Object data) {
        // 插入数据库的具体逻辑
        myMapper.insert(data);
    }

    public void batchInsert(List<Object> dataList) {
        for (Object data : dataList) {
            self.insertData(data); // 通过代理对象调用,确保事务生效
        }
    }
}
    • @Transactional(propagation = Propagation.REQUIRES_NEW)
      每次调用 insertData 方法都会开启一个新的事务,并独立提交。

    • self.insertData(data)
      必须通过代理对象调用事务方法。如果直接调用 this.insertData(data),事务不会生效,因为 Spring 的事务是通过代理实现的。

    • 循环调用事务方法
      每次循环插入时,都会创建一个新事务并提交,确保单次插入操作失败不会影响其他操作。

posted @ 2024-11-16 22:19  塔下补刀就是菜丶  阅读(7)  评论(0编辑  收藏  举报