Является ли time.time () безопасным подходом при программном создании типов контента на plone? - PullRequest
1 голос
/ 30 июня 2011

Я должен использовать _createObjectByType на Plone. Я имею в качестве аргумента id объекта. Будет ли безопасным в этом сценарии создание идентификатора на основе time.time(), чтобы избежать коллизий? Могут ли два запроса иметь одинаковую метку времени, показанную time.time()?

1 Ответ

5 голосов
/ 01 июля 2011

Вы будете в полной безопасности, даже если маловероятно, что два запроса обрабатываются одновременно, в случае конфликта ZODB вызовет ConflictError и повторите ваш запрос.

Отвечая на обсуждение ниже:

На одном компьютере по определению обе транзакции должны перекрываться (вы получили один и тот же результат от time.time () в каждом потоке.) ZODB - это MVCC, поэтому каждый поток видит согласованное представление базы данных, как это было, когда сделка началась. Когда второй поток фиксируется, возникает конфликтная ошибка, потому что он будет записывать объект, который изменился с начала транзакции.

Если ваши клиенты работают на нескольких компьютерах, вам нужно подумать о возможности смещения часов между клиентами. Для своих идентификаторов транзакций ZODB выбирает, какая из них больше либо текущей отметки времени, либо идентификатора последней транзакции + 1.

Однако, возможно, вам следует вообще не использовать метку времени в качестве идентификатора, так как это приведет к конфликтам при большой нагрузке, поскольку все запросы будут создавать записи в одном и том же сегменте BTree. Случайный выбор идентификаторов устранит почти все конфликты, но приведет к неэффективно заполненным BTrees. Рекомендуемый подход для каждого потока, который создает объекты для запуска в случайной точке в пространстве чисел и создания идентификаторов последовательно. Если он обнаружит, что идентификатор уже использовался, ему следует случайным образом выбрать другую точку в пространстве номеров и начать с нее снова. Я считаю, что zope.intid содержит реализацию этой стратегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...