来自 ArangoDB java 驱动程序的事务无法更改数据库中的任何内容

问题描述

我正在尝试通过 Spring 应用程序中的 Java 驱动程序发送事务。

以下是简化代码

@Test
public void rawTransactiontest(){
    var appContext = new AnnotationConfigApplicationContext(DataLoaderApplication.class);
    var arangoOperations = appContext.getBean(arangoOperations.class);
    String action = "function(){\n" +
            " db = require(\"@arangodb\").db; \n" +
            "db._query(\"LET doc = {title: \\\"Hello\\\"} "+
            "UPSERT { _key: doc._key } INSERT doc._key == null ? UNSET(doc,\\\"_key\\\") : doc " +
            "REPLACE doc IN Books OPTIONS { ignoreRevs: false } RETURN NEW\");\n" +
            "return \"Success\"; \n" +
            "}";
    System.out.println(action);
    var tOpts = new Transactionoptions();
    tOpts.writeCollections("Books");
    tOpts.waitForSync(true);
    var result = arangoOperations.driver().db().transaction(action,String.class,tOpts);
    System.out.println("Commit");

}

这将返回变量结果中的返回值“成功”。但数据库保持不变。在 arangoShell 中做同样的事情工作得很好。 arangoShell 代码如下 -

db._executeTransaction({
collections: { 
  write: ["Books"]
},action: function(){
    db = require("@arangodb").db; 
    db._query("LET doc = {title: \"Hello\"} UPSERT { _key: doc._key } "+
        "INSERT doc._key == null ? UNSET(doc,\"_key\") : doc REPLACE doc"+
        " IN Books OPTIONS { ignoreRevs: false } RETURN NEW");
    return "Success";   
}
});

代码在 shell 中运行良好。其他非事务查询在同一个 Spring 容器中工作正常。 可能是什么问题?

解决方法

.db() 只指向 _system 数据库。必须传递数据库名称才能修复它。