ArangoDB并发问题

3
我尝试了以下步骤:

1.使用Gatlin和Arango Java驱动程序,我尝试创建一个具有并发用户的集合。

2.由于多个线程同时尝试创建集合,因此我遇到了重复名称错误。

是否有任何机制可以在Arango中实现事务机制,允许单个线程创建集合并在该过程期间锁定其他线程。

3个回答

2

同时创建具有相同名称的集合可能会导致重复名称错误。

与插入、删除、更新和查询文档不同,创建、删除和重命名集合不能成为 ArangoDB 事务的一部分。

因此,在并行创建集合时会出现一些竞争情况,目前处理它们的唯一正确方法是检查集合创建响应的返回代码。响应将清楚地指示集合创建是否成功,或者是否存在重复名称错误。应用程序可以适当地处理错误,通过中止操作或选择其他名称来解决问题。


0
使用try catch在创建集合方法中修复了它。如果集合创建失败,将抛出ArangoDB异常。然后在catch块中再次检查集合并返回。

0
问题在于您从不同的线程执行多个数据库请求(例如创建集合)。ArangoDB 对您的客户端线程一无所知。它们只是数据库的其他客户端。数据库事务对您没有帮助。您仍然会收到异常。
避免问题的最简单方法是在线程中使用一个synchronized方法来创建集合。在该方法中,您可以在创建之前检查集合是否已存在。
同步方法一次只能在一个线程中执行。调用它的其他线程将被阻塞。因此,调用您的方法的第一个线程将创建集合,随后的线程将不会尝试创建它。
public synchronized void createCollection(ArangoDatabase database, String collection) {
  if (!database.getCollections().stream().map(c -> c.getName()).anyMatch(c -> c.equals(collection)) {
    database.createCollection(collection);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接