我正在使用REST API。我在Orientdb中遇到各种各样的交易问题。在当前设置中,我们有一个包装ODatabaseDocumentPool的单例。我们通过此设置检索所有实例。每个api调用都是从池中获取实例并使用ODatabaseDocumentTx实例创建OrientGraph的新实例开始的。后面的代码使用ODatabaseDocumentTx和OrientGraph中的方法。在代码的最后,我们在写操作上调用graph.commit(),在所有操作上调用graph.shutdown()。
我有一份问题清单。
要验证,我仍然可以使用我用来创建OrientGraph的ODatabaseDocumentTx实例吗?或者我应该使用OrientGraph.getRawGraph()?
使用OrientGraph时,执行读取操作的最佳方法是什么?即使在读取操作期间,我也会在检索记录时获得OConcurrentModificationExceptions,锁定异常或错误。这是因为OrientGraph是事务性的,即使在检索记录时也会修改版本吗?我应该提一下,我也使用索引管理器并在这些读操作中迭代顶点的边。
当我通过索引管理器获取记录时,是否会更新数据库上的版本?
graph.shutdown()是否会将ODatabaseDocumentTx实例释放回池中?
v1.78是否仍然要求我们锁定交易中的记录?
如果在OrientGraph上将autoStartTx设置为false,我是否必须手动启动事务,还是在访问数据库时自动启动?
示例代码:
ODatabaseDocumentTx db = pool.acquire();
// READ
OrientGraph graph = new OrientGraph(db);
ODocument doc = (ODocument) oidentifialbe.getRecord() // I use Java API to a get record from index
if( ((String) doc.field("field")).equals('name') )
//code
OrientVertex v = graph.getVertex(doc);
for(OrientVertex vv : v.getVertices()) {
//code
}
// OR WRITE
doc.field('d',val);
doc = doc.save();
OrientVertex v = v.getVertex(doc);
graph.addEdge(null, v, otherVertex);
graph.addEdge(null, v, anotherVertex) // do I have to reload the record in v?
// End Transaction
// if write
graph.commit();
// then
graph.shutdown();