问题描述
我正在尝试通过 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 数据库。必须传递数据库名称才能修复它。