2016-07-13 3 views
0

У меня есть случай, в котором у меня есть документ A, который ссылается на документ В.
Это означает, что для того, чтобы ссылаться/удалить вновь созданный документ B, у меня есть два варианта:MongoDB иой атомная вставки/удаление

  1. Вставить документ B в документе А
  2. Пусть код приложения создать документ B, а затем обновить документ А

Я знаю, что MongoDB/Морфий не поддерживает атомарной операции по ссылкам, поэтому вам нужно управлять ими самостоятельно.
Для моего варианта использования, это не вариант для вставки документа B, они являются частью независимой коллекции, которая должна оставаться таковой.

Итак, я остался с вариантом 2. Но я хотел бы знать, что является лучшим решением для управления транзакционным характером запроса.
I.e. Если документ B вставлен/удален, но создание/удаление ссылки на документ A не выполняется, оно не должно быть выполнено.

Вы откатываетесь, перевернув операцию в блоке try/catch/finally?
Есть ли общее решение этой проблемы?

Я использую Morphia для реализации Dao.

ответ

0

Лучше всего, вероятно, сделать что-то вроде:

datastore.save(b); 
try { 
    datastore.save(a); 
} catch (Exception e) { 
    datastore.delete(b); 
} 

Вы могли бы сделать и сохраняет в попытке, конечно. Это не защитит вас от катастрофических сбоев приложений между экономиями, но в противном случае будет достаточно. В базе данных также есть условия гонки, например (параллельные вставки документов с одинаковыми значениями для полей с уникальными индексами).

+0

Спасибо за информацию! – Trace

Смежные вопросы