NutzCN Logo
问答 insert 并发写入时唯一索引键报错 Duplicate entry
发布于 959天前 作者 qq_0cfd91a2 1330 次浏览 复制 上一个帖子 下一个帖子
标签:

实体使用了@Prev注解,uid具有唯一索引

@Data
public class Foo {
  @Id
  @Column
  private long id;

 @Name
 @Column
 @Prev(
            els = {@EL("$me.uid()")}
 )
 private String uid;

 public String uid() {
        if (Strings.isBlank(uid)) {
            return UUID.randomUUID().toString();
        } else {
            return uid;
        }
    }
}

并发调用insert

List<Foo> foos= new ArrayList<>();
for (int i = 0; i < 20; i++) {
    Foo foo = new Foo();
    foo .setUid(i + "-" + System.currentTimeMillis());
    foos.add(foo);
}

final List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < 4; i++) {
      final int finalI = i;
      futures.add(
          CompletableFuture.runAsync(
              () -> {
                final List<Foo> input = foos.subList(5 * finalI, 5* (finalI + 1));
                for (final Foo foo: input) {
                  dao().insert(movie);
                }
              }));
    }
    CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
        .exceptionally(
            e -> {
              log.warn(">>>>>>>>>" + e.getMessage());
              return null;
            }).join();

因为之前uid是否手动赋值都会报错 Duplicate entry

3 回复

这明显是你的业务问题

麻烦仔细看代码,这里面一行业务都没有的,那你的意思是我不该这么写吗,那一行错了

foo.setUid(i + "-" + System.currentTimeMillis());

100%重复, 循环20次都不用1ms

添加回复
请先登陆
回到顶部