springboot在mysql里批量操作数据的一个问题。

瑞hong不还钱
  • 66

假如我现在要在mysql做一些批量的操作,比如批量新增、批量删除。但是我需要在操作完以后知道哪些数据是操作成功/失败的。请问这个要怎么设计呢?直接加事务保证全部成功或者全部失败吗?如果不用事务呢?请大神指教,谢谢。

回复
阅读 1.2k
2 个回答

如果又要性能,又要快速插入,个人感觉只能使用一些简单的策略;

1、直接循环一条一条插入,性能肯定是最差的,但是也要看业务是不是会同时插入成百上千条,如果插入的量本来就是在可控范围内的,那么完全可以使用一条一条插入的方法;

2、整体批量插入,整体批量插入只能返回一个插入成功的数量,如果数量比预期数量少,那说明一定是有一部分失败了,因此在插入的时候最好带一个唯一ID,使用唯一ID,用 in 进行查询,最终得到两者 id 差集,将差集 id 条目再次插入,这里可以使用递归进行,保证最终所有条目插入完成;

3、基于分批次的插入,假设我们的业务的失败率大概在 1%, 那么我们可以尝试分批次插入,每批 10 条, 将这 10 条按照上面 整体批量插入 的方法进行插入即可,这样即可以防止大面积的反查,也可以保证一定的效率,具体分成几批,每批多少条,要看业务本身而定;

雄帅
  • 222

首先看你SQL怎么写,

  1. 比如拿insert举例 你是insert into table (...) values 后面使用循环添加插入的数据那么这种是要么成功要么失败,
  2. 如果是先循环,内部进行insert into ,这种就存在有成功的有失败的.
    不推荐第2种写法
    但是springboot 添加@Transactional后如果一条添加失败报错,那么会全部回滚
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏