sqlite: создайте идентификатор транзакции для транзакции с несколькими вставками - PullRequest
1 голос
/ 29 марта 2012

Я добавляю серию записей (например, 100) для одной транзакции. Я хочу, чтобы каждая запись имела поле «идентификатор транзакции», которое увеличивается для каждой новой транзакции и имеет одинаковое значение для каждой записи, вставленной в конкретную транзакцию. Я хочу, чтобы клиенты могли выполнить запрос, а затем в какой-то момент в будущем выполнить тот же запрос, но получать только записи с более новым идентификатором транзакции. Какой лучший способ сделать это? Я действительно не хочу генерировать ID на уровне приложения, потому что к БД обращаются несколько процессов, поэтому мне придется координировать перекрестный процесс распределения ID. Или я мог бы иметь выделенную таблицу TXID с одним столбцом autoincrememt, вставить в нее перед началом транзакции и использовать last_insert_rowid () в качестве TXID, но кажется немного неэффективным хранить таблицу инкрементных чисел только для генерации идентификаторов. Какие-нибудь мысли? Спасибо.

1 Ответ

1 голос
/ 30 марта 2012

Если вам нужно увеличивающееся целое число, вам действительно следует сделать то, что вы предложили - иметь другую таблицу, поддерживающую идентификаторы транзакций. Вы можете достаточно регулярно просматривать эту таблицу, чтобы удалять строки, хотя они будут очень маленькими и эффективными, так что это не должно вызывать беспокойства.

Существует множество других возможных решений, но, как вы уже выяснили, большинство из них не работают в вашей ситуации (вероятность столкновений, в зависимости от требуемой точности). Если вам нужно использовать базу данных, чтобы гарантировать уникальность, это единственный способ сделать это в SQLite. В качестве альтернативы, вы можете попробовать что-то вроде random или randomblob функции , но, очевидно, нет никаких гарантий уникальности для PRG.

Если вам не нужно монотонно увеличивающееся целое число, вы также можете сгенерировать RFC 4122 UUID на уровне приложения (они могут конфликтовать, хотя и редко, если вы запись из многих процессов - вы также можете пометить ее строкой, специфичной для процесса, и сделать ее URN, что-то вроде urn:uuid:<tag>+<uuid>). Если все авторы находятся на одном компьютере, то для тега будет достаточно использовать что-то вроде pid, чтобы гарантировать уникальность.

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