MongoDB findAndModify является атомарным в кластере? [Дубликат]

Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.

В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:

  1. Добавить RigidBody к вашему объекту с помощью AddComponent> Физика> Rigidbody Затем зайдите в свой скрипт и введите rb = GetComponent<Rigidbody>();. Эта строка кода работает лучше всего под ваши функции Start() или Awake().
  2. Вы можете добавить компонент программно и назначить переменную одновременно с одной строкой кода: rb = AddComponent<RigidBody>();

Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))] над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!

16
задан depthfirstdesigner 10 November 2011 в 17:07
поделиться

2 ответа

MongoDB не предлагает репликации master-master или множественную совместимость. Другими словами, запись всегда переходит на один и тот же сервер в наборе реплик. По умолчанию даже чтения из вторичных отключены, поэтому поведение по умолчанию заключается в том, что вы обмениваетесь только одним сервером за раз. Поэтому вам не нужно беспокоиться о непоследовательных результатах в безопасном режиме, если вы используете атомные модификаторы (например, $inc, $push и т. Д.).

Если вы не хотите ограничивать себя этими атомными модификаторами, сравнить и поменять, как рекомендовано dcrosta (и mongo docs ) выглядит неплохо. Однако все это не связано с наборами реплик или осколками - это будет одно и то же в односерверном сценарии.

Если вам необходимо обеспечить согласованность чтения и в случае сбоя базы данных / узла, вы следует убедиться, что вы пишете большинство серверов в безопасном режиме.

Оба подхода ведут себя по-другому, если вы разрешаете небезопасные чтения : операции атомного обновления все равно будут работать (но может дать неожиданные результаты), в то время как подход сравнения и свопинга потерпел неудачу.

2
ответ дан mnemosyn 28 August 2018 в 04:32
поделиться

Могут быть другие способы достижения этого, но один из них - это версия ваших документов и выпуск обновлений только с той версией, которую пользователь ранее читал (т. е. убедиться, что никто другой не обновил документ, поскольку он был последним читать). Ниже приведен краткий пример этой методики с использованием pymongo:

>>> db.foo.save({'_id': 'a', 'version': 1, 'things': []}, safe=True)
'a'
>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing1'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}

note выше, ключ «n» равен 1, что указывает на то, что документ был обновлен

>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': False, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 0}

здесь, где мы пытались обновить неверную версию, ключ «n» равен 0

>>> db.foo.update({'_id': 'a', 'version': 2}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}
>>> db.foo.find_one()
{'things': ['thing1', 'thing2'], '_id': 'a', 'version': 3}

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

17
ответ дан dcrosta 28 August 2018 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: