Зарезервировать идентификатор автоинкремента в транзакции - PullRequest
2 голосов
/ 07 марта 2009

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

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

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

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

Есть ли способ сделать что-то вроде временного резервирования первичного ключа, чтобы в случае сбоя системы он не оказался в несовместимом состоянии?

В первую очередь меня интересуют базы данных MySQL, но если в стандартном SQL есть что-то, что позволит мне это сделать (и, следовательно, совместимо с другими бэкэндами баз данных), мне также интересно это знать.

Ответы [ 2 ]

2 голосов
/ 07 марта 2009

Легко, просто поместите обе операции в транзакцию. Запустите транзакцию, создайте группу, создайте пользователя, затем подтвердите транзакцию.

SET autocommit = 0

START TRANSACTION

INSERT INTO Groups ...
INSERT INTO Users ...

COMMIT

Вы должны использовать механизм, который поддерживает транзакции, такие как InnoDB, для ваших таблиц, чтобы это работало. Механизм MyISAM по умолчанию не поддерживает транзакции.

0 голосов
/ 07 марта 2009

Если вы используете транзакции, у вас не возникнет проблем.

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