Я работаю над REST API. У меня все проблемы с транзакциями в Orientdb. В текущей настройке у нас есть синглтон, который обтекает ODatabaseDocumentPool. Мы извлекаем все экземпляры с помощью этой настройки. Каждый вызов api начинается с приобретения экземпляра из пула и создания нового экземпляра OrientGraph с использованием экземпляра ODatabaseDocumentTx. В следующем коде используются методы из ODatabaseDocumentTx и OrientGraph. В конце кода мы вызываем graph.commit() для операций записи и graph.shutdown() для всех операций.
У меня есть список вопросов.
-
Чтобы проверить, я все еще могу использовать экземпляр ODatabaseDocumentTx, который я использовал для создания OrientGraph? Или я должен использовать OrientGraph.getRawGraph()?
-
Как лучше всего использовать операции чтения при использовании OrientGraph? Даже во время операций чтения я получаю исключения OConcurrentModificationExceptions, исключения блокировки или ошибки при получении записей. Это потому, что OrientGraph является транзакционным, а версии изменены даже при получении записей? Следует отметить, что я также использую диспетчер индексов и перебираю через ребра вершины в этих операциях чтения.
-
Когда я получаю запись через Index Manager, обновляет ли она версию в базе данных?
-
Вернул ли graph.shutdown() экземпляр ODatabaseDocumentTx в пул?
-
Требуется ли v1.78 блокировать записи в транзакциях?
-
Если для параметра autoStartTx установлено значение false на OrientGraph, мне нужно начинать транзакции вручную или автоматически запускаться при доступе к базе данных?
Пример кода:
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();