"Атомный раздел" в драйвере 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

Другие вопросы по тегам