"Атомный раздел" в драйвере Ruby MongoDB?
Есть ли способ выполнить набор неатомарных действий на сервере MongoDB (используя драйвер Ruby) как единое атомарное действие? Что мне нужно, так это в основном блокировка определенного объекта / коллекции.
2 ответа
Нет способа сделать это в драйвере Ruby, потому что нет способа сделать это в MongoDB. Mongo поддерживает только атомарные операции с одним документом. Таким образом, в основном вставка, обновление или удаление одного документа выполняется атомарно, а не операции над несколькими документами.
Вы можете подделать транзакцию, попытавшись выполнить откат вручную, если произойдет ошибка. Откат в этом случае мог бы заменить любые изменения предыдущими значениями. Но это будет сделано вручную и не будет иметь ACID-гарантий, которые вы могли бы получить от большинства SQL-серверов.
Поскольку вы можете выполнять элементарные операции над отдельными документами, есть способы имитации того, что вы хотите. Смотрите эту статью:
http://kylebanker.com/blog/2010/06/07/mongodb-inventory-transactions/
А о некоторых принципах, лежащих в основе идей, см. Этот:
http://www.eaipatterns.com/docs/IEEE_Software_Design_2PC.pdf