Вы будете в полной безопасности, даже если маловероятно, что два запроса обрабатываются одновременно, в случае конфликта ZODB вызовет ConflictError и повторите ваш запрос.
Отвечая на обсуждение ниже:
На одном компьютере по определению обе транзакции должны перекрываться (вы получили один и тот же результат от time.time () в каждом потоке.) ZODB - это MVCC, поэтому каждый поток видит согласованное представление базы данных, как это было, когда сделка началась. Когда второй поток фиксируется, возникает конфликтная ошибка, потому что он будет записывать объект, который изменился с начала транзакции.
Если ваши клиенты работают на нескольких компьютерах, вам нужно подумать о возможности смещения часов между клиентами. Для своих идентификаторов транзакций ZODB выбирает, какая из них больше либо текущей отметки времени, либо идентификатора последней транзакции + 1.
Однако, возможно, вам следует вообще не использовать метку времени в качестве идентификатора, так как это приведет к конфликтам при большой нагрузке, поскольку все запросы будут создавать записи в одном и том же сегменте BTree. Случайный выбор идентификаторов устранит почти все конфликты, но приведет к неэффективно заполненным BTrees. Рекомендуемый подход для каждого потока, который создает объекты для запуска в случайной точке в пространстве чисел и создания идентификаторов последовательно. Если он обнаружит, что идентификатор уже использовался, ему следует случайным образом выбрать другую точку в пространстве номеров и начать с нее снова. Я считаю, что zope.intid содержит реализацию этой стратегии.